如何在jupyter lab上使用异步小部件?
我正在尝试在jupyter lab上复制官方异步小部件示例,但是await
无法继续执行。
设置/复制
docker run --rm -p 8888:8888 -e JUPYTER_ENABLE_LAB=yes jupyter/datascience-notebook start-notebook.sh --NotebookApp.token=''
firefox 0.0.0.0:8888
- 创建一个新的python3笔记本
- 创建一个单元格并输入以下代码
- 运行单元格
- 移动滑块
单元格代码
%gui asyncio
import asyncio
def wait_for_change(widget, value):
future = asyncio.Future()
def getvalue(change):
# make the new value available
future.set_result(change.new)
widget.unobserve(getvalue, value)
widget.observe(getvalue, value)
return future
from ipywidgets import IntSlider
slider = IntSlider()
async def f():
for i in range(10):
print('did work %s'%i)
#x = await asyncio.sleep(1)
x = await wait_for_change(slider, 'value')
print('async function continued with value %s'%x)
asyncio.ensure_future(f())
#task = asyncio.create_task(f())
slider
预期结果
该单元格输出:
did work 0
async function continued with value 1
did work 1
async function continued with value 2
[...]
实际输出
第一个did work 0
之后没有任何内容。
注释
我特别是指 jupyter lab,而不是普通的 jupyter 笔记本。
没有任何错误消息或其他提示,期望的输出只是没有发生。
最小的 asyncio 示例在 jupyter lab 中可以正常工作:
import asyncio
async def main():
print('hello')
await asyncio.sleep(1)
print('world')
await main()
如果您不加入
-e JUPYTER_ENABLE_LAB=yes
,则您将得到一个常规的Jupyter笔记本,没有Jupyter Lab,这时您将会得到期望的结果。这与 ipywidgets widgets values not changing 或 Jupyter Interactive Widget not executing properly 不是重复问题,因为这些问题均不包含Jupyter Lab或asyncio。