问题:每个流程有多少“QThread”实例“合理”?
(这特别引用了Qt的QThread
实例,但从逻辑上讲,该问题应与使用任何库的任何基于线程的设计相关。)
例如,我了解特定于平台的资源限制可能默认支持最多三十(30)个“QTcpSocket
”实例,因此理论上,如果您有三十个活动套接字,则为30个{ {1}}系统处于最大负载时的实例。但是,这可能不是什么大问题,因为大多数线程应该“睡眠/等待”网络流量。
类似地,我假设一个人会实例化为“{连续工作”负责的QThread
实例的“核心”或“本地线程可以执行”的数量。因此,如果您有八(8)个核心,那可能是另外八个QThread
个实例(当系统处于最大负载时,这些实例可能一直在工作)。
然后,当然,我们有“主线”。
这是否暗示人们会实例化:
(30个socket-threads)+(8个worker-for-core-core)+(1个主线程)
...对于39个线程(在8核系统上)?
具体来说,如果特定于应用程序的需求具有其他线程池需求,并且在那里添加了十几个 - QThread
- 这里和十几个 - QThread
- 实例,那么它似乎是100 { {1}}实例有点愚蠢,即使它们中的大多数都是“空闲/睡眠/等待”,对吗?
那么,有没有截止? “39线程”是“合理的”,但“300线程”是“不合理的”?
(是的,我知道有一个“默认堆栈大小的每个线程”,例如“每个线程10MB”,所以我受到虚拟内存的限制。但是,真的,实例化是愚蠢的30K线程 - 这是一个糟糕的设计,可能会想要这样的东西?)
答案 0 :(得分:0)
您可以使用QThread::idealThreadCount()找出当所有线程都忙时可以提高性能的线程数。对于大多数等待的线程,限制是依赖于操作系统的,但对于Qt,使用信号插槽系统而不是很多线程更好。只有一个连接了信号的对象,而不是额外的线程,它总是更轻,特别是如果额外的线程也拥有它自己的事件循环。大多数Qt网络应用程序可能根本不应该使用线程。