使用Twisted构建多线程服务器是否是一个好选择?

6

我需要从数百个pop3电子邮件帐户中收取数据,并且我想构建一个强大的服务器来完成这项工作。

对于这种项目,Twisted会是一个好选择吗?

现在,一个简单的原型是从单个pop3帐户中获取数据,然后它会从许多帐户中获取数据,但这将是一个串行过程。

我想创建一个具有多个线程的服务器,以便可以同时执行不同的任务。

4个回答

7
Twisted是一个用Python编写的事件驱动型网络框架。它在异步和非阻塞特性方面有很强的支持,最适合开发利用这些特性的网络应用程序。同时,它也支持线程,以便处理无法提供异步非阻塞I/O的情况。这是基于大部分时间都花费在等待网络I/O操作的事实。
利用这一点的两种模型是:创建多个线程,每个线程完成一个单独的任务,或者使用非阻塞I/O来在单个进程中完成多个任务的单个过程(通过交错执行多个任务)。Twisted非常适用于第二种模型。
非阻塞模型。
+--------------------------+
|task1 | wait period | comp|
+--------------------------+
       +--------------------------+
       |task2 | wait period | comp|
       +--------------------------+

您可以使用Twisted开发一个非常强大的服务器,并且它支持POP3/IMAP。这里有一个构建pop3客户端的例子,您可以参考:使用Twisted构建pop3客户端

2
考虑到您的大部分POP3活动将是网络I/O,这正是Twisted擅长的地方。您不是真正地进行线程操作,而是执行基于事件的异步套接字操作,这是Twisted的最大优点。
因此,是的,Twisted将是这种项目的好选择。它可以同样出色地完成客户端和服务器操作,并且启动一个新的异步TCP客户端几乎是微不足道的,它已经默认提供了一个POP3 TCP客户端

0

对于服务器来说,这是一个不错的选择,但根据您的描述,您实际上正在寻找一个多线程的POP客户端。

Twisted适用于响应诸如传入请求之类的事件,而您需要发送请求,因此在这种情况下,我担心Twisted的价值有限。


2
完全不是这样的。当涉及到网络层时,客户端和服务器并没有太大的区别。 - Jean-Paul Calderone

-1
关于Twisted的一点小提醒,虽然Twisted非常强大,但我发现使用文档中提供的代码示例启动100个线程会导致竞争条件和死锁。我的建议是尝试使用Twisted,但如果Twisted变得难以管理,可以准备好标准库的多线程模块。我已经成功地使用了生产者消费者模型,使用了上述库。

4
当涉及到线程时,Twisted对竞态条件的倾向并不更多或更少。Twisted的优点在于能够在不使用线程的情况下完成许多事情。实际上,像twisted.internet.threads.deferToThread这样的辅助工具确实可以减轻线程的一些麻烦。;) - Jean-Paul Calderone
我指的是这个模型更易于理解、调试,一般比twisted出现更少的问题。我并不是想争辩哪个库更好。我同意Twisted的技术优势更强大,但这并不是使用框架的唯一原因。 - ebt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接