【问题标题】:How can I use Asynchronous Widgets on jupyter lab?如何在 jupyter lab 上使用异步小部件?
【发布时间】:2020-03-18 15:37:14
【问题描述】:

如何在 jupyter lab 上使用异步小部件?

我试图在 jupyter lab 上重现 the official Asynchronous Widgets-Example,但 await 永远不会继续。

设置/复制

  1. docker run --rm -p 8888:8888 -e JUPYTER_ENABLE_LAB=yes jupyter/datascience-notebook start-notebook.sh --NotebookApp.token=''
  2. firefox 0.0.0.0:8888
  3. 创建一个新的 python3 笔记本
  4. 创建一个单元格并在下面输入代码
  5. 运行单元格
  6. 移动滑块

单元格代码

%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 notebooks

  • 没有错误消息或任何东西。预期的输出没有发生

  • 最小的 asyncio-example 确实在 jupyter 实验室中工作:

import asyncio
async def main():
    print('hello')
    await asyncio.sleep(1)
    print('world')
await main()

【问题讨论】:

    标签: jupyter-notebook python-asyncio jupyter-lab ipywidgets


    【解决方案1】:

    实际上它可以工作,但是 jupyter 丢失了打印输出。 试试这个代码:

    from IPython.display import display
    import ipywidgets as widgets
    
    out = widgets.Output()
    
    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()
    
    # Now the key: the container is displayed (while empty) in the main thread
    async def f():
        for i in range(10):
            out.append_stdout('did work %s'%i)
            x = await wait_for_change(slider, 'value')
            out.append_stdout('async function continued with value %s'%x)
    asyncio.ensure_future(f())
    
    display(slider)
    display(out)
    

    您可以在此处找到更多详细信息:https://github.com/jupyter-widgets/ipywidgets/issues/2567#issuecomment-535971252

    【讨论】:

      【解决方案2】:

      我很幸运使用 jupyter-ui-poll 将小部件活动与 Jupyter Python 内核同步:

      https://github.com/Kirill888/jupyter-ui-poll

      特别是我在这里使用它:

      https://github.com/AaronWatters/jp_doodle/blob/master/jp_doodle/auto_capture.py

      为我工作。 希望对您有所帮助!

      【讨论】:

      猜你喜欢
      • 2019-03-06
      • 1970-01-01
      • 1970-01-01
      • 2019-11-11
      • 1970-01-01
      • 1970-01-01
      • 2022-06-17
      • 1970-01-01
      • 2020-03-20
      相关资源
      最近更新 更多