Thread,QThread,每个进程有多少是“合理的”?

Posted

技术标签:

【中文标题】Thread,QThread,每个进程有多少是“合理的”?【英文标题】:Thread, QThread, how many per process is "reasonable"? 【发布时间】:2012-10-16 15:56:16 【问题描述】:

问题:每个进程有多少个“QThread”实例是“合理的”?

(这特别引用了 Qt 的 QThread 实例,但从逻辑上讲,这个问题应该与使用任何库的任何基于线程的设计有关。)

例如,我了解特定于平台的资源限制可能默认支持最多三十 (30) 个“QTcpSocket”实例,因此理论上,如果您有 30 个活动套接字,则将是 30 个 QThread系统处于最大负载下的实例。不过,这可能没什么大不了的,因为这些线程中的大多数应该“休眠/等待”网络流量。

同样,我会假设一个人会为负责“繁重连续工作”的QThread 实例实例化多达“核心”或“本机线程可以执行”的数量。因此,如果您有八 (8) 个内核,那可能是另外八个 QThread 实例(当系统处于最大负载时,这些实例可能一直在工作)。

那么,当然,我们有“主线程”。

这是否意味着要实例化:

(30 个套接字线程)+(每个核心 8 个工作线程)+(1 个主线程)

...对于 39 个线程(在 8 核系统上)?

具体来说,如果特定于应用程序的需求还有其他线程池需求,并且您在此处添加一打-QThread-here 和一打-QThread-instances-there,则似乎有 100 个 QThread 实例有点傻,即使他们中的大多数都是“空闲/睡觉/等待”,对吧?

那么,有没有截止日期? “39-threads”是“合理的”,但“300-threads”是“不合理的”?

(是的,我知道有一个“每个线程的默认堆栈大小”,例如“每个线程10MB”,所以我受到虚拟内存的限制。但是,真的,实例化是愚蠢的吗30K 线程——这是一个糟糕的设计,想要这样的东西?)

【问题讨论】:

我经常被警告不要在服务器或大规模 P2P 代码中使用每个连接的线程类型模型——它们的扩展性不是很好。 (每个线程都会占用相当多的内存,除非您只是这样调整。)对于客户端来说,这可能并不重要(因为要观看的内容数量通常要少得多)。答案几乎完全取决于您正在制作的应用程序的类型。但是要知道(至少在大多数线程实现中)一个线程可以很好地监视一堆连接,并将真正的工作传递给工作线程池。 视情况而定。 Kaspersy 在我的盒子里有 166 个线程,总共 1198 个。 【参考方案1】:

您可以使用QThread::idealThreadCount() 找出当所有线程都忙时有多少线程可能会提高性能。对于大部分等待的线程,限制是依赖于操作系统的,但对于 Qt,最好使用信号槽系统而不是非常多的线程。只连接一个带有信号的对象总是比额外的线程更轻,特别是如果额外的线程也有它自己的事件循环。大多数 Qt 网络应用程序可能根本不应该使用线程。

【讨论】:

以上是关于Thread,QThread,每个进程有多少是“合理的”?的主要内容,如果未能解决你的问题,请参考以下文章

Qthread 锁定 Gui PySide

QThread 线程间通信:连接到 &QThread::quit 与连接到 lambda [&thread] thread->quit(); 的奇怪行为

QThread 和 GUI 线程说明

如何使用 QThread 创建一个分离的线程,就像在 std::thread 中一样

QThread 完成状态

QThread: Destroyed while thread is still running