2017-10-10 4 views
7

J'essaye d'implémenter le moteur de calcul distribué asynchrone pour python, qui est compatible avec le cahier de jupyter. Le système est censé être basé sur une approche de "notification push" ce qui rend (presque, je l'espère) impossible de permettre à l'utilisateur d'attendre un résultat de calcul spécifique (c'est-à-dire bloquer l'exécution d'une cellule portable donnée). Pour être précis, je suis en train de:Bloc jupyter portable exécution de la cellule jusqu'à un message spécifique reçu

  1. Ajouter une nouvelle tâche à jupyter boucle d'événements portable (la tâche est de vérifier périodiquement si msg spécifique est arrivé en boucle while, des pauses quand msg sont arrivés)
  2. bloc cellule en cours attendre que la tâche soit terminée.
  3. encore en mesure de traiter les messages entrants (en utilisant RabbitMQ, Pika, le code légèrement modifié par http://pika.readthedocs.io/en/0.10.0/examples/asynchronous_consumer_example.html)

J'ai préparé des cahiers présentant mon problème: https://github.com/SLEEP-MAN/RabbitMQ_jupyterNotebook_asyncio

Toutes les idées? Est-ce possible (peut-être une magie IPython/IpyKernel;?), Ou je dois changer mon approche de 180 degrés?

+0

Ajout d'une réponse de test, s'il vous plaît jeter un oeil –

Répondre

0

Votre problème est que vous avez mélangé deux boucles différentes en une. C'est pourquoi cela n'a pas fonctionné. Vous devez faire quelques changements.

Utilisation AsyncioConnection au lieu de TornadoConnection

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

Ensuite, vous devez supprimer la ligne ci-dessous

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

Parce que votre boucle est déjà démarré en connexion. Ensuite, vous devez utiliser le code ci-dessous pour attendre

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

Et maintenant il fonctionne

AsyncIO waiting