Запуск нескольких экземпляров Tornado дает iol oop уже запущенную ошибку - PullRequest
3 голосов
/ 20 марта 2020

Вот так выглядит мой код (исключая некоторые детали, которые на самом деле не актуальны)

from multiprocessing.pool import ThreadPool as Pool

class GetUsers(BaseTask):
    def foo(self):
        pool = Pool()
        try:
            pool.map(self.bar, users)
        finally:
            pool.close()
            pool.join()

    def bar(self, users):
        uuid = users[0]
        ioloopInstance = ioloop.IOLoop().instance()
        isInExperiment = self.isInExperiment(uuid, ioloopInstance)
        log.info(str(uuid)+str(isInExperiment))

    def isInExperiment(self, uuid, ioloop):
        isInExpTag_response =ioloop.run_sync(lambda: self.
                                             fetch_isInExperiment_response(uuid))
        if len(isInExpTag_response.body) > 0:
            return True
        return False

    @gen.coroutine
    def fetch_isInExperiment_response(self, uuid):
        response = yield baz
        raise gen.Return(response)

Когда я запускаю это, я получаю ошибку ioloop is already running. Я чувствую, что это потому, что несколько запущенных процессов пытаются получить доступ к одному и тому же экземпляру Tornado, и поэтому эта ошибка видна. Я пытался прочитать документацию по торнадо и видел в Интернете другие ресурсы, пытающиеся решить ту же ошибку, но не смог найти ничего полезного.

Может кто-нибудь помочь мне?

1 Ответ

2 голосов
/ 24 марта 2020

Это сработало после того, как я изменил from multiprocessing.pool import ThreadPool as Pool на from multiprocessing import Pool

Я использовал Threadpool в качестве обходного пути для исправления Не могу засолить при использовании многопроцессорной обработки Pool.map () эта ошибка, но в дальнейшем использовался copy_reg, как определено здесь https://laszukdawid.com/2017/12/13/multiprocessing-in-python-all-about-pickling/ для решения всей проблемы.

...