Могу ли я инициализировать торнадо IOLoop.instance перед тем, как создавать новые процессы?

Могу ли я инициализировать IOLoop.instance и затем обработать новые процессы, которые используют IOLoop.instance()? Что-то вроде:

#some code which initializes IOLoop.instance()           (1)
storage - Storage()
...
def f(storage):
    """some ioloop worker, which uses IOLoop.instance()"""
    storage.db_client.send(some value)
    ...

p1 = Process(target=f, args=(storage,))
p2 = Process(target=f, args=(storage,))

Документация IOLoop ничего не говорит об использовании IOLoop с многопоточностью, но документация tornado.process.fork_processes запрещает инициализацию IOLoop перед разветвлением.

Дело в том, что код в (1) создает storage объект, который используется функцией f, storage содержит клиент асинхронной базы данных, который должен использовать тот же ioloop, что и рабочий процесс.

1 ответ

Решение

Спросив группу пользователей торнадо, я получил ответ, что не могу использовать IOLoop, созданный родительским процессом в дочернем процессе. Решение очень простое:

def f(storage):
    """some ioloop worker, which uses IOLoop.instance()"""
    # worker code starts here
    del IOLoop._instance

    # here we can safe use IOLoop
    IOLoop.instance().add_callback(...)
    storage.db_client.send(some value)
Другие вопросы по тегам