服务器上多个客户端的双线程

时间:2014-12-23 02:58:24

标签: python multithreading twisted python-multiprocessing

我使用Twisted实现了一个服务器程序。我正在使用twisted.protocols.basic.LineReceivertwisted.internet.protocol.ServerFactory

我想让连接到服务器的每个客户端并行运行一组函数(我正在考虑多线程)。

我对使用twisted.internet.threads.deferToThread解决此问题感到困惑。

  1. 为此,我应该在deferToThread中致电ServerFactory吗?
  2. 是否有扭曲的螺纹,在竞争条件方面是否符合线程安全?
  3. 以前,我尝试在我的服务器程序中使用multiprocessing,但它似乎与Twisted反应器组合使用,而deferToThread完成了这项工作。
  4. 我想知道Twisted线程是如何实现的?他们不能使用multiprocessing吗?

1 个答案:

答案 0 :(得分:1)

  
      
  1. 以前,我尝试在我的服务器程序中使用多处理,但它似乎不能与Twisted反应器结合使用,而deferToThread完成了这项工作。我想知道Twisted线程是如何实现的?他们不是在使用多处理吗?
  2.   

您没有说过您是使用多线程版本的多处理程序还是多处理程序的多进程版本。

您可以阅读有关在Stack Overflow上混合Twisted和多处理的内容:

Mix Python Twisted with multiprocessing?   Twisted network client with multiprocessing workers?   is twisted incompatible with multiprocessing events and queues?

(还有更多)

要回答这个问题的较短部分 - 不,Twisted不使用stdlib multiprocessing包来实现其线程API。它使用stdlib threading模块。

  
      
  1. 是否有扭曲的螺纹,在竞争条件方面是否符合线程安全?
  2.   

上面的回答暗示了这个问题的答案:没有。 "扭曲的线程"真的不是一件好事。 Twisted的线程API只是stdlib threading模块之上的一个层(它实际上只是POSIX线程的Python API(或者在Windows上类似但有些不同).Twisted' s线程API不会神奇地消除竞争条件的可能性(如果在Twisted中存在任何魔法,那么能够同时执行某些事情没有使用线程 - 这有助于减少数量你的计划中的竞争条件,虽然它并没有完全消除创建它们的可能性。)

  
      
  1. 我是否应该为此deferToThread致电ServerFactory
  2.   

我不太确定这个问题的重点是什么。您是否想知道ServerFactory子类上的某个方法是否是您拨打deferToThread的最佳位置?这可能取决于您的实施方法的细节。不过,它可能并没有产生巨大的差异。如果你喜欢让工厂为协议实例提供服务的模式 - 去吧。