【发布时间】:2013-09-21 13:35:06
【问题描述】:
据我了解,并行 API 在内部使用线程池,它们将项目排队以进行并行处理,但是,当我使用 SOS 调试器检查一个此类并行循环的执行情况时,我的理解是,如果我有 10 个任务如果排好队,那么它们可能不会并行运行,CLR 将决定为要执行的给定任务调度多少线程,因此它可能是 4 或 5 或 6(每次执行中的数量不同)
但是,如果我的总任务数不是很高,比如 10,并且我希望它们全部并行运行,因为它们都是长时间运行的,那么最好将它们放在传统线程上,这将确保 1每个任务线程,它们都并行 如果任务数是 100 这样的好数字,那么使用 Parallel 或 Threadpool 是一个实用的解决方案,因为我们不希望每个进程调用 100 个单独的线程
请分享您的观点,我理解 Parallel API 的好处使完整的 Parallel 编程很容易实现,但这里我的目标不同
【问题讨论】:
-
只需使用 TPL。这是一个相当开放的主观问题,您没有明确说明您的目标是什么,并且在问题中做出了一些不连贯的假设。 “常规线程”并不神奇,它们仍然会受到物理硬件和操作系统的限制。
-
@Jodrell:线程使用抢占式时间片,允许任何数量并行运行(开销增加)。如果没有
LongRunning选项,TPL 将不适合需要同时激活许多任务的场景(即使实际上只是如此)。 -
@Douglas,这取决于 OP 长期运行的含义。无论哪种方式,使用 TPL 都是有意义的。如果这项工作是“长期运行”,那么我已经赞成的你的答案很好地适用。如果我创建 1000 个“常规线程”,它们的性能将与 1000 个
LongRunningTPLTasks一样糟糕。
标签: c# .net multithreading parallel-processing