Coroutine as background job in Jupyter notebook

安稳与你 提交于 2019-12-07 05:30:09

问题


I have a coroutine which I'd like to run as a "background job" in a Jupyter notebook. I've seen ways to accomplish this using threading, but I'm wondering whether it's also possible to hook into the notebook's event loop.

For example, say I have the following class:

import asyncio
class Counter:
    def __init__(self):
        self.counter = 0

    async def run(self):
        while True:
            self.counter += 1
            await asyncio.sleep(1.0)

t = Counter()

and I'd like to execute the run method (which loops indefinitely), while still being able to check the t.counter variable at any point. Any ideas?


回答1:


The following basically does what I want I think, but it does use a separate thread. However, I can still use the async primitives.

def run_loop():
    loop = asyncio.new_event_loop()
    run_loop.loop = loop
    asyncio.set_event_loop(loop)
    task = loop.create_task(t.run())
    loop.run_until_complete(task)

from IPython.lib import backgroundjobs as bg
jobs = bg.BackgroundJobManager()
jobs.new('run_loop()')
loop = run_loop.loop # to access the loop outside



回答2:


There's a simplified version of what Mark proposed:

from IPython.lib import backgroundjobs as bg
jobs = bg.BackgroundJobManager()
jobs.new(asyncio.get_event_loop().run_forever)

If you need, you can access the loop with asyncio.get_event_loop()



来源:https://stackoverflow.com/questions/36895256/coroutine-as-background-job-in-jupyter-notebook

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!