我可以初始化一个IOLoop.instance而不是使用IOLoop.instance()的fork新进程吗?
类似于:
#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。 最佳答案
在tornado用户组上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)
关于python - 我可以在派生新进程之前初始化 Tornado IOLoop.instance吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10972845/