2

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 を使用すると想定される非同期データベース クライアントが含まれています。

4

1 に答える 1

4

tornado ユーザーグループに問い合わせたところ、親プロセスで作成した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)
于 2012-06-18T22:25:00.190 に答える