1.Task会不会自动限制同时运行的任务数量?
2.如果需要手动限制,那么怎样在不同的机器上实现最高效率?
原则上不会,但是一般都是手动明限制,因为不限制并发量大的话会吃CPU,一般我们都是按照CPU核心数去处理的,Environment.ProcessorCount+1;
1.task背后是线程池来实现的
只不过默认设置的比较大,所以除非并行任务特别多,否则基本可以看做不限制
2.最小任务数=CPU核心数量,最大任务数=CPU核心数量 x 2
1.task本身基于线程池,既然是池,自然会有池大小。只是系统池比较大,大到正常情况下,你可以认为他“无限”
2.如果你像手段限制,请自己实现继承并实现自己的线程调度器(task自己使用ThreadPoolTaskScheduler这个调度器,这下你明白为啥我们说task本身就是基于线程池了把)
3 有关池化就是控制背压buffer,当然buffer是一个方面,其实另一个方面核心是数量,所以很多园子文章大神们会神秘兮兮告诉你什么“智能线程池库”,其实就一句话
System.Threading.SemaphoreSlim slim = new SemaphoreSlim(100, 200)
这个就是那些园子大神们的装大神的秘密了
4.没有在不同机器上最高效率的方法,只有动态背压控制(滑动移动窗口limtrate,令牌桶),和静态背压控制(cpu核心数的2倍)等策略控制,请注意这些是策略,而不是技术。
5.补充一下,我们在来告诉你一个园子大神们几乎不会告诉你的秘密(告诉你了,他们还怎么写文章装大神啊,原本就2句话的事情,1分钟看完明了的事情,这要告诉你的,他们还怎么写文章上首页混推荐啊)
var ConcurrentScheduler = new ConcurrentExclusiveSchedulerPair(TaskScheduler.Default, 8);
//我们限制这个任务最多并行8个
Task.CompletedTask
.ContinueWith(p => { }, ConcurrentScheduler.ConcurrentScheduler);