在Python中同时检查大量IMAP帐户

在Python中同时检查大量IMAP帐户,python,imap,scalability,email-client,Python,Imap,Scalability,Email Client,我必须编写一个小守护程序,它可以检查多个(可能多达数百个)电子邮件帐户中的新邮件 到目前为止,我的想法是: 我可以为每个连接创建一个新线程,使用它每x秒检索一次消息,或者尽可能使用IMAP IDLE。我还可以稍微修改imapclient,并在所有只使用单个线程激活IMAP IDLE的套接字上select() 有没有更好的方法来解决这项任务?如果你几个月后再问,因为Python 3.3.1可能会有一个漂亮的新异步API。请参阅当前的原型,但您可能还不想使用它 如果您使用的是Windows,那么您可

我必须编写一个小守护程序,它可以检查多个(可能多达数百个)电子邮件帐户中的新邮件

到目前为止,我的想法是:

我可以为每个连接创建一个新线程,使用它每x秒检索一次消息,或者尽可能使用IMAP IDLE。我还可以稍微修改imapclient,并在所有只使用单个线程激活IMAP IDLE的套接字上
select()


有没有更好的方法来解决这项任务?

如果你几个月后再问,因为Python 3.3.1可能会有一个漂亮的新异步API。请参阅当前的原型,但您可能还不想使用它

如果您使用的是Windows,那么您可能可以毫无问题地处理几百个线程。如果是这样,这可能是最简单的解决方案。所以,试试看

如果您使用的是Unix,您可能希望使用
poll
而不是
select
,因为
select
在进入数百个连接时伸缩性很差。(linux上的
epoll
或Mac/BSD上的
kqueue
甚至更具可扩展性,但在进入数千个连接之前,这通常并不重要。)

但是在你自己动手之前,有一些事情你可能需要考虑:

Twisted
无疑是其中最难进入的,但它还附带了一个IMAP客户机,可以随时使用,还有数百种其他功能,因此如果您愿意处理一些学习曲线,您可能会做得更快

Tornado
感觉最像是编写原生
select
-类型代码。我并不知道它的所有特性;它可能有一个IMAP客户机,但如果没有,您将以与
select
相同的方式对
imapclient
进行黑客攻击

Monocle
位于
Twisted
Tornado
之上,您可以在Twisted或Tornado之上编写类似于3.3.1的代码(虽然实际上,您可以直接在Twisted中使用
inlineCallbacks
执行相同的操作,但这只是因为文档会阻止您学习,而不必先学习其他内容)。同样,您也可以在这里对
imapclient
进行黑客攻击。(或者改用
Twisted
的IMAP客户机……但此时,您最好直接使用
Twisted

gevent
允许您编写与线程(或同步)几乎相同的代码您可能需要对
imapclient
进行一些修改,但这可能与运行magic monkeypatching实用程序一样简单,仅此而已。除此之外,您编写的代码与使用线程编写的代码相同,只是创建了一组greenlet,而不是一组线程,并且获得了一个ord一个或两个更好的可伸缩性


如果您希望获得绝对最大的可扩展性,您可能希望同时并行化和多路复用(例如,在Unix上运行8个进程,每个进程使用
gevent
,或者在Windows上将本机线程池连接到IOCP),但对于几百个连接来说,这应该是不必要的。

twisted.mail
可能也很有用。您使用的是什么平台?几百个接近300或800吗?@frb:看起来很有用,thx!@abarnert:Unix(但越独立越好)。连接可以接近800。好的,如果你想在Unix和Windows上都安装800个套接字,并且希望能够支持低端系统,是的,我认为
gevent
twisted。mail
就是答案。我想如果我想使用
Monocle
或类似产品,我必须编写自己的邮件客户端。我想我会看看
Twisted
-看起来很有希望:)@snøreven:我已经用更多的信息更新了答案。是的,你必须破解
imapclient
或者编写你自己的,使用它们中的大多数。但是有了
gevent
,你可能就可以像编写线程一样使用magic monkeypatch
imapclient