我可以在分配新流程之前初始化tornado IOLoop.instance吗?

时间:2012-06-10 22:28:55

标签: python multiprocessing tornado

我可以初始化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。

1 个答案:

答案 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)