python - 在 Python 中一次检查大量 IMAP 帐户

标签 python imap scalability email-client

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

到目前为止我的想法:

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

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

最佳答案

要是几个月后你再问就好了,因为 Python 3.3.1 可能会有一个漂亮的新异步 API。参见 http://code.google.com/p/tulip/对于当前的原型(prototype),但您可能还不想使用它。

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

如果你在 Unix 上,你可能想使用 poll 而不是 select,因为当你进入数百个连接。 (Linux 上的 epoll 或 Mac/BSD 上的 kqueue 更具可扩展性,但在您进入数千个连接之前通常并不重要。)

但在您自己执行此操作之前,您可能需要考虑以下几点:

Twisted 绝对是其中最难入门的——但它还附带了一个随时可用的 IMAP 客户端,以及其他数百个东西,所以如果你愿意处理一点学习曲线,您可能会完成得更快。

Tornado 感觉最像写原生的 select 类型的代码。我实际上并不知道它附带的所有功能;它可能有一个 IMAP 客户端,但如果没有,您将以您考虑使用 select 的相同方式破解 imapclient

Monocle 位于 TwistedTornado 之上,让您可以编写类似于 3.3.1 中的代码,在 Twisted 或 Tornado 之上(尽管实际上,您可以使用 inlineCallbacks 在 Twisted 中直接做同样的事情,只是文档不鼓励您在不先学习其他所有内容的情况下学习它)。同样,您会在这里破解 imapclient。 (或者改用 Twisted 的 IMAP 客户端……但在那个时候,您还不如直接使用 Twisted。)

gevent 让您可以编写与线程(或同步)代码几乎相同的代码,并且神奇地使其成为异步代码。您可能需要对 imapclient 进行一些修改,但这可能就像运行 magic monkeypatching 实用程序一样简单,仅此而已。除此之外,您编写的代码与使用线程编写的代码相同,只是您创建了一堆 greenlet 而不是一堆线程,并且您获得了一个数量级或两个更好的可扩展性。

如果您正在寻找绝对最大的可扩展性,您可能希望同时进行并行化和多路复用(例如,运行 8 个进程,每个进程使用 gevent,在 Unix 上,或附加Windows 上 IOCP 的 native 线程池),但对于几百个连接,这不是必需的。

关于python - 在 Python 中一次检查大量 IMAP 帐户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14182560/

相关文章:

Python Pandas DF 根据列列表创建新变量

python - 如何重写 django 模型删除方法以在删除时保存几个字段

python - IIS 和 ISAPI-WSGI = 非常慢

imap - 使用 C# AE.Net.Mail 的 IMAP 在不支持基本身份验证后是否可以工作

gmail - IMAP x Gmail =>标签?

Python:IMAP 连接到 gmail 返回错误

java - Heavy DB 读写操作的设计选项

python - 在 Python 中查找独眼巨人数字

php - 将用户数据存储在服务器上的 JSON 文件中

database - 专业的数据库,如 BigTable、SimpleDB