Могу ли я инициализировать торнадо 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)