2016-04-27 21 views
3

Ich habe eine Coroutine, die ich gerne als "Hintergrundjob" in einem Jupyter-Notebook ausführen würde. Ich habe ways to accomplish this using threading gesehen, aber ich frage mich, ob es auch möglich ist, in die Ereignisschleife des Notebooks einzuhaken.Coroutine als Hintergrundjob in Jupyter Notebook

Zum Beispiel sagen, dass ich die folgende Klasse haben:

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

und ich möchte die run-Methode auszuführen (die auf unbestimmte Zeit-Schleifen), während immer noch die t.counter Variable an irgendeiner Stelle überprüfen zu können. Irgendwelche Ideen?

Antwort

1

Folgendes funktioniert im Grunde, was ich will, denke ich, aber es verwendet einen separaten Thread. Ich kann jedoch immer noch die asynchronen Primitive verwenden.

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

Es gibt eine vereinfachte Version von dem, was Mark vorgeschlagen:

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

Wenn Sie benötigen, können Sie die Schleife mit asyncio.get_event_loop() zugreifen können