我可以初始化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 documentation没有说明使用多线程的IOLoop,但是tornado.process.fork_processes documentation禁止在分叉之前初始化IOLoop。
关键是(1)中的代码创建storage
对象,由函数f
使用。 storage
包含异步数据库客户端,假设它使用与工作进程相同的ioloop。
答案 0 :(得分:4)
在龙卷风用户组asking之后,我收到了答案,我不能在子进程中使用父进程创建的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)