2014-12-23 23 views
1

我已经实现了使用Twisted服务器程序。我正在使用twisted.protocols.basic.LineReceiver以及twisted.internet.protocol.ServerFactory为多个客户绞合线对服务器

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

我对这个问题使用twisted.internet.threads.deferToThread有些困惑。

  1. 为此,我应该拨打 ServerFactory吗?
  2. 扭曲线程,线程安全相对于竞争条件?
  3. 此前,我尝试在我的服务器程序中使用multiprocessing,但它似乎不能与Twisted reactor一起使用,而deferToThread完成了这项工作。

我在想如何实施Twisted线程?他们不使用multiprocessing

回答

1
  • 之前,我想在我的服务器程序中使用多,但它似乎没有与扭曲的反应器组合工作,而deferToThread做的工作。我想知道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. 扭曲的线程是否相对于竞态条件是线程安全的?

    这个问题的答案是上面的回答暗示:没有。 “扭曲的线程”并不是真正的事情。 Twisted的线程API只是在STDLIB threading模块之上的一层(这实际上只是POSIX线程(或什么样的相似,但不同的在Windows上)一个Python API。Twisted的线程API不神奇消除竞争条件的可能性(如果在扭曲的任何魔法,它是做某些事情的能力,同时不使用线程在所有 - 这有助于减少在你的程序中竞争条件的号码,虽然它并没有完全消除他们创造的可能性)。

    1. 我应该叫在ServerFactory为此目的deferToThread

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