之前在项目中需要多线程抓取一些数据,一开始的时候使用了.net自带的ThreadPool。但是后来发现一些问题,主要是ThreadPool.SetMax方法返回false问题。导致设置无效,然后所有的任务全部自动启动了,导致被对方服务器怀疑是镜像工具,予以封杀。而且也占据了本地PC大量资源。
很多时候,我们是希望只在后台启动指定个数的线程执行任务,使得本地资源可控。
通过查找资料发现,SetMax失效的原因主要是,设置的线程数量,不能低于本地PC的CPU的逻辑核心数。由于我这设置的线程数为10,但是本地CPU核心数为6,加上超线程,逻辑核心数为12(i7-8700),所以导致SetMax无效。这也是为什么之前我用笔记本的时候没发现问题的原因。
通过一些资料了解到,.net自带的ThreadPool,本身就是为了高并发处理用的,所以为了充分利用计算资源,才有了这个限制。考虑到自己封装一个挺麻烦,还得测试啥的,于是Github了一下,发现一个好东西叫做DedicatedThreadPool,地址:https://github.com/helios-io/DedicatedThreadPool
这是别人封装的一个专用线程池,解决了CLR ThreadPool的“noisy neighbor”的一些问题。
当然,我只需要解决最大线程数可控问题。
果断拿来试用,问题得以有效解决。
推荐