2017-10-10 17 views
7

Tôi đang cố gắng triển khai công cụ tính toán không đồng bộ, phân tán cho python, tương thích với sổ ghi jupyter. Hệ thống được cho là dựa trên phương pháp 'push notification', điều này làm cho nó (hầu như, tôi hy vọng) không thể cho phép người dùng đợi kết quả tính toán cụ thể (nghĩa là thực thi khối của ô sổ ghi chép cho đến khi thông báo kết quả mong muốn được gửi). Để được chính xác, tôi đang cố gắng để:Chặn thực thi ô di động jupyter cho đến khi thư cụ thể nhận được

  1. Thêm nhiệm vụ mới để jupyter loop kiện máy tính xách tay (nhiệm vụ được định kỳ kiểm tra nếu msg cụ thể đã đến trong vòng lặp while, phá vỡ khi msg đến)
  2. tế bào khối hiện tại chờ đợi nhiệm vụ được hoàn thành.
  3. Tuy nhiên có thể xử lý các tin nhắn đến (Sử dụng RabbitMQ, Pika, chút thay đổi mã từ http://pika.readthedocs.io/en/0.10.0/examples/asynchronous_consumer_example.html)

Tôi đã notebook chuẩn bị trình bày vấn đề của tôi: https://github.com/SLEEP-MAN/RabbitMQ_jupyterNotebook_asyncio

Bất kỳ ý tưởng? Là nó có thể (có thể một số ma thuật IPython/IpyKernel;>), hoặc tôi phải thay đổi cách tiếp cận của tôi bằng 180 độ?

+0

Added một câu trả lời thử nghiệm, xin vui lòng có một cái nhìn –

Trả lời

0

Vấn đề của bạn là bạn đã trộn lẫn hai vòng lặp khác nhau trong một. Đó là lý do tại sao nó không hoạt động. Bạn cần thực hiện một vài thay đổi.

Sử dụng AsyncioConnection thay vì TornadoConnection

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

Tiếp theo, bạn cần phải loại bỏ dưới dòng

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

Bởi vì vòng lặp của bạn đã được bắt đầu vào kết nối. Sau đó, bạn cần phải sử dụng mã dưới đây để chờ đợi

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

Và bây giờ nó hoạt động

AsyncIO waiting

Các vấn đề liên quan