使用Gevent记录多个协同例程/ greenlets / microthreads?

时间:2011-08-03 16:32:13

标签: python logging concurrency coroutine gevent

使用Python的gevent记录跨多个正在运行的协同例程/微线程/ Greenlets的事件的最佳方法是什么?

我想记录的事件示例可能包括创建新连接或删除与套接字服务器的连接。

沿着这条思路 - “衍生的”协同例程是否有可能记录到同一个文件?这是否可取,因为可能会对该文件进行并发写入尝试?

1 个答案:

答案 0 :(得分:3)

如果这只是单个过程,那么不,它们不可能同时写入。 Greenlets都在同一个OS线程中运行并且是协同安排的,一次只能运行一个。

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

...会导致greenlets逐一写入日志。

如果您有多个进程,我建议您登录redis,或者使用zeromq登录专用守护进程。或者使用其他一些外部日志记录守护进程。