问题:每个进程有多少“QThread”实例是“合理的”?线程,QThread,每个进程有多少是“合理的”?
(这特别参考Qt的QThread
实例,但在逻辑上的问题应该使用任何图书馆涉及到任何基于线程的设计。)
例如,据我所知,特定于平台的资源限制可能默认最多支持三十(30)个“QTcpSocket
”实例,因此从理论上讲,如果您有三十个活动套接字,那么当系统处于最大负载下时,这将是三十个QThread
实例。但是,这可能不是什么大问题,因为大多数这些线程应该对网络流量进行“睡眠/等待”。
同样,我会假设对于负责“重连续工作”的QThread
实例,可以实例化“核心”或“本机线程可以执行”的数目。因此,如果您拥有八(8)个内核,那么可能是另外八个QThread
实例(并且这些实例可能在系统处于最大负载时全时运行)。
然后,当然,我们有“主线程”。
这是否意味着,然后将一个实例:
(30座线程)+(8工人换每个核心)+(1个主线程)
... 39个线程(在8核心系统上)?
具体而言,如果应用程序的特定需求,有其他的线程池的需求,又添加了一个打─QThread
,尤其是圆形和打─QThread
-instances,在那里,好像100种QThread
情况下是有点傻,即使他们大多数是“空闲/睡觉/等待”,对吧?
那么,有没有一个截止? “39线”是“合理的”,但“300线”是“不合理的”? (是的,我知道有一个“每线程的默认堆栈大小”,如“每线程10MB”,所以我受到虚拟内存的限制。但是,真的,它是愚蠢的实例化30K线程 - 这是一个糟糕的设计,会想要这样的事情吗?)
我经常告诫不要在服务器线程每个连接型模型或大规模P2P码 - 他们没有很好地进行缩放。 (每一个线程都会占用相当多的内存,除非你调整了这些东西。)对于一个客户来说,它可能并不重要(因为要观察的事物数量通常要小得多)。答案几乎完全取决于您制作的应用类型。但是,要知道(至少在大多数线程实现中),一个线程可以很好地观察一堆连接,并将实际工作传递给工作线程池。 – cHao
取决于。卡巴斯在1198个盒子中有166个线程。 –