【问题标题】:.Net Parallel, Task APIs Vs regular Threads.Net 并行、任务 API 与常规线程
【发布时间】: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 个 LongRunning TPL Tasks 一样糟糕。

标签: c# .net multithreading parallel-processing


【解决方案1】:

默认情况下,.NET 线程池会初始化与您机器上的逻辑内核数相对应的工作线程数。随后,它采用爬山启发式算法,根据当前任务工作负载调整此数字,当任务完成时间过长时启动新的工作线程。

您希望通过线程超额订阅(即每个逻辑核心运行多个线程)同时执行长时间运行的任务是正确的。事实上,Task Parallel Library 基础架构 (TPL) 通过 LongRunning 选项专门为此场景提供,该选项(在当前实现下)为每个标记的任务生成一个新的专用线程。

Task.Factory.StartNew(myLongRunningAction, TaskCreationOptions.LongRunning);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-15
    • 1970-01-01
    • 1970-01-01
    • 2015-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多