2016-04-27 46 views
3

我有一個協程,我想在Jupyter筆記本中作爲「後臺作業」運行。我見過ways to accomplish this using threading,但我想知道是否有可能掛鉤到筆記本的事件循環中。協同作爲Jupyter筆記本的背景作業

例如,說我有下面的類:

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變量。有任何想法嗎?

回答

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 
0

有什麼建議馬克的簡化版本:

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

如果你需要,你可以用asyncio.get_event_loop()

訪問循環