我必須編寫一個litte守護程序,可以爲新郵件檢查多個(可能高達數百個)電子郵件帳戶。在Python中一次檢查大量IMAP帳戶
我的想法至今:
我可以創建每個連接一個新的線程,使用imapclient用於檢索郵件每隔x秒,或者使用IMAP IDLE在可能的情況。我也可以修改imapclient一點,並且只在使用單線程激活IMAP IDLE的所有套接字上修改select()
。
有沒有更好的方法來解決這個任務?
我必須編寫一個litte守護程序,可以爲新郵件檢查多個(可能高達數百個)電子郵件帳戶。在Python中一次檢查大量IMAP帳戶
我的想法至今:
我可以創建每個連接一個新的線程,使用imapclient用於檢索郵件每隔x秒,或者使用IMAP IDLE在可能的情況。我也可以修改imapclient一點,並且只在使用單線程激活IMAP IDLE的所有套接字上修改select()
。
有沒有更好的方法來解決這個任務?
如果你只是問幾個月後,因爲Python 3.3.1可能會有一個新的異步API。當前原型請參見http://code.google.com/p/tulip/,但您可能不想使用它。
如果你在Windows上,你可能能夠處理幾百個線程而不會出現問題。如果是這樣,這可能是最簡單的解決方案。所以,試試看。
如果您使用的是Unix,您可能需要使用poll
而不是select
,因爲當您進入數百個連接時,select
會嚴重縮放。 (在Linux上的epoll
或在Mac/BSD上的kqueue
更具可擴展性,但在進入數千個連接之前通常無關緊要。)
但在執行此操作之前可能需要考慮幾件事自己:
Twisted
絕對是最難進入的 - 但它也帶有一個IMAP客戶端,可以在數百個其他的事情中使用,所以如果你願意處理一點學習曲線,你可能會做得更快。
Tornado
感覺最像寫本地select
類型的代碼。我實際上並不知道它帶來的所有功能;它可能有一個IMAP客戶端,但如果沒有,您將以與select
相同的方式駭入imapclient
。
Monocle
坐在要麼Twisted
或Tornado
的頂部,並允許您編寫的代碼,有點像什麼是未來在3.3.1上扭曲或龍捲風的頂部(儘管實際上,你可以直接做同樣的事情在扭絞inlineCallbacks
,這只是說文檔鼓勵你不要先學習其他東西)。再次,你會在這裏駭客imapclient
。 (或使用Twisted
的IMAP客戶端,而不是...但在這一點上,你還不如直接用Twisted
)
gevent
讓你編寫的代碼幾乎相同的線程(或同步)代碼,並神奇地使它異步。您可能需要稍微修改imapclient
,但它可能與運行魔術monkeypatching實用程序一樣簡單,就是這樣。除此之外,您可以使用線程編寫相同的代碼,不同之處在於您創建了一堆greenlet而不是一堆線程,並且您可以獲得一個數量級或兩個更好的可伸縮性。如果你正在尋求絕對最大的可伸縮性,你可能想要同時並行和複用(例如,在Unix上運行8個進程,每個進程使用gevent
,或者將本地線程池附加到IOCP上Windows),但對於幾百個連接,這不應該是必要的。
我想我會寫我自己的郵件客戶端,如果我想使用'Monocle'或類似的?猜猜我會看看'Twisted' - 看起來很有前途:) –
@snøreven:我已經更新了更多信息的答案。是的,你必須破解'imapclient'或寫你自己的,其中大部分。但是對於'gevent',你可能只需要magic-monkeypatch imapclient就可以像使用線程一樣使用它。我會看看這兩個和'扭曲'。 – abarnert
'twisted.mail'也可能對此有用。 http://twistedmatrix.com/documents/current/mail/examples/imap4client.py –
你在哪個平臺上? 「幾百」更接近300或800? – abarnert
@frb:看起來有用,thx! –