我可以初始化一个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/

10-11 04:04