在处理任务时,一个经验法则似乎是线程池 - 通常由例如调用
但是什么是长时间运行的操作?从时间上来说,长时间是多久?在决定是否使用
例如,假设我有500个任务要在专用应用程序中处理,每个任务需要10-20秒完成。我应该只使用Task.Run(例如在循环中)启动所有500个任务,然后等待它们全部完成,可能作为
我猜设置
Task.Run()
或Parallel.Invoke()
使用 - 应该用于相对较短的操作。在处理长时间运行的操作时,我们应该使用TaskCreationOptions.LongRunning
标志,以避免堵塞线程池队列,即将工作推送到新创建的线程中。但是什么是长时间运行的操作?从时间上来说,长时间是多久?在决定是否使用
LongRunning
时,除了预期任务持续时间之外,是否还有其他因素需要考虑,例如预期的CPU架构(频率、核数等)或从程序员角度尝试同时运行的任务数量?例如,假设我有500个任务要在专用应用程序中处理,每个任务需要10-20秒完成。我应该只使用Task.Run(例如在循环中)启动所有500个任务,然后等待它们全部完成,可能作为
LongRunning
,同时保留默认的最大并发级别吗?另一方面,如果在这种情况下设置LongRunning
,那么这是否会创建500个新线程,实际上会导致更多开销和更高的内存使用(由于额外的线程被分配)与省略LongRunning
相比?这是假设在等待这500个任务时不会安排执行任何新任务。我猜设置
LongRunning
的决定取决于在给定时间间隔内向线程池发出的请求数量,并且LongRunning
应仅用于预计要花费大量时间来完成大多数线程池放置任务的任务 - 按定义,最多只有一小部分所有任务。换句话说,这似乎是一个排队和线程池利用率优化问题,如果可能的话,应该通过测试逐案解决。我正确吗?
LongRunning
与并行有什么关系呢?如果没有足够的空间,使用LongRunning = false
来生成500个IO绑定任务只会将它们放在线程池中,而LongRunning = true
会创建500个新线程 - 用户感知的并发性和响应性几乎相同,甚至在后一种情况下由于额外的线程创建开销而更糟糕? - w128LongRunning
只受自身启动限制,速度要快得多。 - Luaan