【问题标题】:Would twisted be a good choice for building a multi-threaded server?twisted 是构建多线程服务器的好选择吗?
【发布时间】:2011-04-07 10:39:17
【问题描述】:

我需要从数百个 pop3 电子邮件帐户中提取信息,并且我想构建一个强大的服务器来执行此操作。

twisted 会是这类项目的好选择吗?

现在一个简单的原型是从单个 pop3 帐户中提取,然后它会从多个帐户中提取,但这将是一个序列化的过程。

我想创建一个有多个线程的服务器,以便它可以同时做事。

【问题讨论】:

    标签: python multithreading twisted


    【解决方案1】:

    Twisted 是一个用 Python 编写的事件驱动的网络框架。它大量建立在异步和非阻塞特性之上,最适合开发利用这些特性的网络应用程序。它为无法提供异步非阻塞 I/O 的用例提供线程支持。这是基于这样一个事实,即大部分时间都花在等待网络 I/O 操作上。

    利用这一点的两个模型是线程模型,您可以创建多个线程,每个线程完成单个任务或使用非阻塞 I/O 通过交错多个任务在单个进程中完成多个任务的单个进程。 Twisted 非常适合第二种模式。

    非阻塞模型

    +--------------------------+
    |task1 | wait period | comp|
    +--------------------------+
           +--------------------------+
           |task2 | wait period | comp|
           +--------------------------+
    

    您可以使用 Twisted 开发一个非常强大的服务器,它支持 POP3 / IMAP。

    有一个如何构建pop3 client with twisted的例子。

    【讨论】:

      【解决方案2】:

      考虑到您的大部分 POP3 活动将是网络 I/O,这就是 Twisted 擅长的地方。执行基于事件的异步套接字操作并不是真正的线程,这是 Twisted 的至高无上的荣耀。

      所以,是的,Twisted 将是此类项目的不错选择。它可以很好地执行客户端和服务器操作,并且启动一个新的异步 TCP 客户端几乎是微不足道的,并且它已经有一个默认可用的 POP3 TCP Client

      【讨论】:

        【解决方案3】:

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

        Twisted 用于对传入请求等事件做出反应,您需要发送请求,所以在这种情况下,我担心扭曲的价值有限。

        【讨论】:

        • 一点也不。当涉及到网络层时,客户端和服务器并没有什么不同。
        【解决方案4】:

        谨慎使用twisted,虽然twisted 非常健壮,但我发现使用文档中提供的代码示例启动100 个线程会导致竞争条件和死锁。我的建议是尝试扭曲,但如果扭曲变得无法管理,则让 stdlib 多线程模块等待。我在使用上述库的生产者消费者模型方面取得了很好的成功。

        【讨论】:

        • 在涉及线程时,Twisted 既不容易也不容易出现竞争条件。 Twisted 的伟大之处在于能够无需线程完成许多事情。实际上,像 twisted.internet.threads.deferToThread 这样的助手实际上确实从线程中消除了一点痛苦。 ;)
        • 这是我所指的模型,我认为它更容易理解、更容易调试,并且通常比扭曲的问题更少。我并不是要争辩说一个图书馆比另一个图书馆更好。我同意扭曲的技术优点是优越的,但这不是使用框架的唯一原因。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-10-04
        • 2012-06-17
        • 2011-05-01
        • 2011-01-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多