4

Pythonのgeventを使用して、実行中の複数のコルーチン/マイクロスレッド/ Greenletsにまたがるイベントをログに記録するための最良のアプローチは何ですか?

ログに記録したいイベントの例には、新しい接続の作成やソケットサーバーへの接続の削除が含まれます。

この考え方に沿って、「生成された」コルーチンが同じファイルにログを記録することは可能ですか?そのファイルへの潜在的な同時書き込み試行のために、それもお勧めですか?

4

1 に答える 1

3

これが単一のプロセスである場合、いいえ、同時に書き込むことはできません。グリーンレットはすべて同じOSスレッドで実行され、協調してスケジュールされます。一度に実行できるのは1つだけです。

with open('log', 'w') as log:
    jobs = [gevent.spawn(log.write, 'event %d' % i) for i in range(10)]
    gevent.joinall(jobs)

...グリーンレットがログに1つずつ書き込まれる結果になります。

複数のプロセスがある場合は、にログを記録するredisか、zeromqを使用して専用デーモンにログを記録することをお勧めします。または、他の外部ログデーモンを使用します。

于 2011-08-03T16:57:11.137 に答える