У меня есть приложение tornado
, которому необходимо запустить функцию блокировки на ProcessPoolExecutor
. Эта функция блокировки использует библиотеку, которая испускает инкрементные результаты через события blinker
. Я хотел бы собрать эти события и отправить их обратно в свое приложение tornado
по мере их возникновения.Соберите инкрементные результаты от ProcessPoolExecutor от Tornado
Сначала tornado
был идеален для этого случая использования, потому что он асинхронный. Я думал, что могу просто передать объект tornado.queues.Queue
функции, которая будет запущена в пуле, а затем put()
событий в этой очереди как часть моего обратного вызова события blinker
.
Однако, прочитав документы tornado.queues.Queue
, я узнал, что они не управляются через процессы, такие как multiprocessing.Queue
и не являются потокобезопасными.
Есть ли способ получить эти события из pool
по мере их возникновения? Должен ли я обернуть multiprocessing.Queue
, чтобы он произвел Futures
? Это вряд ли работает, поскольку я сомневаюсь, что внутренние компоненты multiprocessing
совместимы с tornado
.
[EDIT] Есть некоторые хорошие подсказки здесь: https://gist.github.com/hoffrocket/8050711
Это не совсем то, что я имею в виду. Чтобы уточнить, у меня есть один медленный вызов функции. И этот вызов функции выдает несколько событий через 'blinker'. Я хотел бы собирать эти события и отправлять их обратно в основной поток торнадо.Я считаю, что код, который у вас здесь, выполняет четыре медленные функции параллельно, а не одну медленную функцию. – matthewatabet