我第一次使用并行任务,而不是使用传统的线程池。在我的应用程序中,我允许用户输入开始完成作业的任务数。 (工作可能非常大)。我注意到,如果我允许任何超过10个左右的任务,应用程序就会开始挂起,实际上由于使用了资源,性能会下降。
我想知道处理器数量和最大任务量之间是否存在任何关联,这样我就可以限制用户pc的最大任务量,这样就不会减慢它的速度。
答案 0 :(得分:6)
不,主要是因为没有任务的定义。任务可能是CPU密集型(限制类似于核心*因子),IO密集型(限制可能非常低),或网络密集型有限的资源(不喜欢同时处理1000个请求)。
因此,作为程序员,您需要使用大脑并提出一个概念,然后对其进行验证,然后将其放入您的程序中,具体取决于任务实际是什么以及预计瓶颈在哪里。这样的计划可能很复杂 - 非常复杂 - 但大部分时间都很简单。
答案 1 :(得分:5)
TPL将自动更改任务的安排方式,并随着时间的推移添加或删除ThreadPool线程。这意味着,如果有足够的时间和类似的工作,默认行为应该改进为最佳选择。
默认情况下,它将使用比核心更多的线程来启动,因为许多任务不是“纯CPU”。鉴于您看到额外的任务导致速度减慢,您可能有资源争用(通过锁定),或者您的任务受CPU限制,并且具有比处理器核心更多的任务将导致速度减慢。如果这会有问题,您可以制作一个自定义TaskScheduler,以限制一次允许的任务数量,例如LimitedConcurrencyTaskScheduler。这允许您将任务数量限制为纯CPU方案中的处理器数量。
如果您的任务受到其他因素的限制,例如IO,那么您可能需要进行配置以确定并发计划任务的数量与吞吐量之间的最佳平衡,尽管这是系统特定的。
答案 2 :(得分:1)
假设您的任务是CPU密集型的(即他们没有进行大量的I / O阻塞,例如读取文件),您可能希望将并行任务的数量限制为可用的CPU核心数量到您的申请。例如,如果您的应用程序在具有四核处理器(即4个核心)的计算机上运行,则将其限制为4个同时执行的任务。
如果您的任务受到CPU以外的其他任务的限制(例如磁盘访问,网络访问等),那么您需要确定每个任务平均占用的资源份额。如果您知道平均值,则应该运行以充分利用资源的任务数为100 / average
。