【问题标题】:Coroutine as background job in Jupyter notebook协程作为 Jupyter 笔记本中的后台作业
【发布时间】:2020-01-02 07:30:50
【问题描述】:

我有一个协程,我想在 Jupyter 笔记本中作为“后台作业”运行它。我见过ways to accomplish this using threading,但我想知道是否也可以挂钩到笔记本的事件循环中。

例如,假设我有以下课程:

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()

我想执行 run 方法(无限循环),同时仍然能够随时检查 t.counter 变量。有什么想法吗?

【问题讨论】:

    标签: python jupyter python-asyncio jupyter-notebook


    【解决方案1】:

    以下基本上是我想要的,但它确实使用了一个单独的线程。但是,我仍然可以使用异步原语。

    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】:

      我认为您的代码运行良好,您只需要创建一个任务来包装协程,即:

      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()
      asyncio.create_task(t.run())
      

      等待 10 秒,然后检查

      t.counter
      

      应该得到

      > 10
      

      【讨论】:

      • 这种方法很方便,但您必须注意在笔记本中运行的其他单元格将使用相同的事件循环这一事实(与 Mark 的回答不同,其中单独的循环有不同的循环)线程),因此将在其阻塞操作期间饿死Counter.run 方法。如果计数器每秒持续递增很重要,那么除非没有其他笔记本单元将被使用或它们不执行任何阻塞操作,否则这将不起作用。
      【解决方案3】:

      Mark 提出的建议有一个简化版本:

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

      如果需要,可以使用asyncio.get_event_loop()访问循环

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-08-06
        • 2022-06-12
        • 2023-02-16
        • 1970-01-01
        • 2021-06-30
        • 1970-01-01
        • 2016-12-06
        • 2019-08-25
        相关资源
        最近更新 更多