2011-08-03 55 views
4

使用Python的gevent記錄跨越多個正在運行的協程/ microthreads/Greenlets的事件的最佳方法是什麼?使用Gevent記錄多個協同程序/ greenlets/microthreads?

我想記錄的示例事件可能包括創建新的連接或將連接丟棄到套接字服務器。

沿着這樣的思路 - 是否有可能'衍生'協同程序登錄到同一個文件?由於可能對該文件進行併發寫入嘗試,這甚至是可取的嗎?

回答

3

如果這只是單一過程,那麼不,他們不可能同時寫入。 Greenlet都在同一個操作系統線程中運行,並且可以協同調度,一次只能運行一個。

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

...會導致greenlet逐一寫入日誌。

如果你有多個進程,我建議登錄到redis,或者使用zeromq登錄到一個專用的守護進程。或者使用其他外部日誌記錄守護進程。

+0

那麼,你*可以*寫*從greenlet的文件,如果你確定他們被序列化。 –

+0

@Denis你可以擴展嗎? – Archie1986

+2

@ Archie1986從不同的greenlet寫入同一個文件的「併發」並不是真正的併發,因爲文件I/O被阻塞,但不能像使用套接字I/O那樣使其成爲「綠色」。但是,在大多數情況下,它通常足夠快。因此,即使您有併發的greenlet寫入同一個文件,在任何給定的時間,最多隻有一個greenlet實際上正在寫入文件。 –