记录一个ThreadPool插件

之前在项目中需要多线程抓取一些数据,一开始的时候使用了.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”的一些问题。

当然,我只需要解决最大线程数可控问题。

果断拿来试用,问题得以有效解决。

推荐

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值