我正在编写一个简单的程序,它使用Twisted在运行多个客户端和多个服务器的单台计算机之间来回发送消息。对这些消息的回复需要相当长的计算,这就是我在客户端和服务器上实现deferToThread()
和Callback()
的原因,以免阻止消息进入。
但是,我想最大化可以同时处理的同时活动连接的数量。我认为,就目前而言,我的程序可以处理10个同时活动的连接(如在10个线程中执行客户端或服务器上的回复计算)。这是有效连接的默认数量是否有意义,我是否可以使用here描述的反应堆的suggestThreadPoolSize()
选项来增加它?
答案 0 :(得分:3)
如果您的程序受CPU限制,那么Python global interpreter lock将阻止您拥有任何多CPU并发,因此摆弄线程池大小对程序的速度没有太大的实际影响可以处理新的联系。
相反,您应该使用reactor.spawnProcess
来启动子进程,并将CPU密集型工作移交给子进程池。诸如Ampoule之类的东西可能会帮助您更方便地做到这一点。
然而,即使是多个进程也只会为您带来与CPU相同的CPU并发性... CPU。 (好吧,核心,或超线程,真的;但是,至少是“逻辑”CPU。)当你没有可用资源来实际做这项工作时,接受更多的工作将会建立起巨大的作用在内存中缓冲并最终导致程序崩溃。最终你需要apply backpressure。
Twisted确实提供了all the tools you need来做到这一点,尽管我们正在努力使其成为even easier。
哦 - 这应该不言而喻,但如果您的程序不是受CPU限制,那么您应该停止使用线程; - )。