【问题标题】:Python Twisted Maximum Number Of Active ConnectionsPython Twisted 最大活动连接数
【发布时间】:2013-06-06 03:44:11
【问题描述】:

我正在编写一个简单的程序,它使用 Twisted 在运行多个客户端的单台计算机和多个服务器之间来回发送消息。回复这些消息需要相当长的计算时间,这就是为什么我在客户端和服务器上都实现了deferToThread()Callback(),以免阻止消息进入。

但是,我想最大化可以同时处理的同时活动连接的数量。我认为,就目前而言,我的程序可以同时处理 10 个活动连接(如在 10 个线程中执行计算以在客户端或服务器上进行回复)。这是默认的活动连接数是否有意义,我可以使用here 所述的反应器的suggestThreadPoolSize() 选项来增加它吗?

【问题讨论】:

  • 您是否受到处理(CPU 限制、请求排队)或网络(连接打开/关闭)的限制?线程数多于内核数通常是不明智的,但我并没有真正理解您的问题。
  • 我的问题可以概括为:suggestThreadPoolSize() 选项有什么作用?
  • suggestThreadPoolSize() 只是更改了最大并发线程数。但是,您的问题不是您想的那样-您不应该使用该选项,因为它仅与线程中的 I/O 绑定操作真正相关(例如您需要与 3rd-party 数据库驱动程序执行的操作) ,或主机名解析)。有关更多信息,请参阅我的答案。

标签: python networking client-server twisted


【解决方案1】:

如果您的程序受 CPU 限制,那么 Python global interpreter lock 将阻止您进行任何多 CPU 并发,因此调整线程池大小不会对您的程序处理速度产生太大实际影响有了新的连接。

相反,您应该使用reactor.spawnProcess 来启动一个子进程,并将您的 CPU 密集型工作转移到一个子进程池中。 Ampoule 之类的内容可能会帮助您更方便地执行此操作。

但是,即使是多个进程也只会为您购买尽可能多的 CPU 并发性...... CPU。 (嗯,实际上是内核或超线程;但是,至少是“逻辑”CPU。)当您没有可用资源来实际执行这项工作时,接受更多的工作将会产生巨大的影响在内存中缓冲并最终使您的程序崩溃。最终你需要apply backpressure

Twisted 目前确实提供了 all the tools you need 来执行此操作,尽管我们正在努力使其成为 even easier

哦 - 这应该不言而喻,但如果你的程序 不是 CPU-bound,那么你应该停止使用线程;-)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-08
    • 2021-08-01
    • 2019-10-15
    • 1970-01-01
    • 2023-03-07
    • 2014-07-07
    • 2011-07-01
    • 1970-01-01
    相关资源
    最近更新 更多