2017-10-10 3 views
7

Ich versuche, asynchrone, verteilte Berechnung-Engine für Python zu implementieren, die mit Jupyter Notebook kompatibel ist. Das System sollte auf dem "Push Notification" -Ansatz basieren, was es (fast hoffentlich) unmöglich macht, dass der Benutzer auf ein bestimmtes Berechnungsergebnis warten kann (d. H. Die Ausführung einer gegebenen Notebookzelle blockiert, bis die Nachricht mit dem erwarteten Ergebnis geliefert wird). Um genau zu sein, ich versuche zu:Block jupyter Notebook Zelle Ausführung bis spezifische Nachricht erhalten

  1. neue Aufgabe In der Notebook-Ereignisschleife jupyter (die Aufgabe in regelmäßigen Abständen überprüft, ob bestimmter msg in angekommen while-Schleife, bricht, wenn msg angekommen)
  2. Block-Stromzelle Warten auf die Aufgabe abgeschlossen werden.
  3. Noch in der Lage sein, eingehende Nachrichten zu verarbeiten (mit RabbitMQ, Pika, leicht modifizierte Code http://pika.readthedocs.io/en/0.10.0/examples/asynchronous_consumer_example.html)

Ich habe vorbereitet Notebooks mein Problem präsentiert: https://github.com/SLEEP-MAN/RabbitMQ_jupyterNotebook_asyncio

Irgendwelche Ideen? Ist es möglich (vielleicht etwas IPython/IpyKernel magic;>?), Oder muss ich meinen Ansatz um 180 Grad ändern?

+0

Added eine getestete Antwort, haben Sie bitte einen Blick –

Antwort

0

Ihr Problem ist, dass Sie zwei verschiedene Loops in einem gemischt haben. Deshalb hat es nicht funktioniert. Sie müssen einige Änderungen vornehmen.

Verwenden AsyncioConnection statt TornadoConnection

return adapters.AsyncioConnection(pika.URLParameters(self._url), 
             self.on_connection_open) 

Als nächstes müssen Sie unterhalb der Linie entfernen

self._connection.ioloop.start() #throws exception but not a problem... 

Weil Ihre Schleife bereits in connect gestartet wird. Dann müssen Sie den folgenden Code verwenden, zu warten

loop = asyncio.get_event_loop() 
loop.run_until_complete(wait_for_eval()) 

Und jetzt funktioniert es

AsyncIO waiting

Verwandte Themen