简体   繁体   English

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

[英]How can I use Asynchronous Widgets on jupyter lab?

How can I use Asynchronous Widgets on jupyter lab ?如何在 jupyter lab上使用异步小部件?

I'm trying to reproduce the official Asynchronous Widgets-Example on jupyter lab , but the await never continues.我试图在 jupyter lab上重现官方的异步小部件示例,但await永远不会继续。

Setup / reproduction设置/再现

  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. create a new python3 notebook创建一个新的 python3 笔记本
  4. create a cell and enter the code below创建一个单元格并输入下面的代码
  5. run cell运行单元
  6. move slider移动 slider

code for the cell单元格代码

%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

Expected result预期结果

The cell outputs单元格输出

did work 0
async function continued with value 1
did work 1
async function continued with value 2
[...]

Actual output实际 output

nothing after the first did work 0第一个did work 0

Notes笔记

  • I'm specifically talking about jupyter lab and not about regular jupyter notebooks我专门谈论的是 jupyter实验室,而不是常规的 jupyter 笔记本

  • There is no error-message or anything.没有错误消息或任何东西。 The expected output just doesn't happen预期的 output 只是没有发生

  • The minimal asyncio-example does work in jupyter lab:最小的 asyncio-example 确实在 jupyter 实验室中工作:

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

Actually it works, but jupyter lose print output.实际上它有效,但 jupyter 丢失打印 output。 Try this code:试试这个代码:

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)

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

I've had luck with jupyter-ui-poll to synchronize widget activity with the Jupyter Python kernal:我很幸运使用 jupyter-ui-poll 将小部件活动与 Jupyter Python 内核同步:

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

In particular I used it here:特别是我在这里使用它:

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

Works for me.为我工作。 Hope that helps!希望有帮助!

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM