首页 > 后端开发 > C++ > 任务和并行

任务和并行

Patricia Arquette
发布: 2025-01-26 12:03:09
原创
777 人浏览过

Task and Parallel

本文探讨了 C# 中 Parallel.ForEachTask 系列(特别是 Task.WhenAllTask.Run 等)之间的主要区别。两者都有助于并发或并行代码执行,但它们的应用程序、行为和任务处理有很大不同。

并行.ForEach:

Parallel.ForEachSystem.Threading.Tasks 命名空间的成员,支持对集合进行并行迭代。它自动在线程池中的可用线程之间分配工作负载,对于 CPU 密集型操作来说非常高效。

主要特点:

  • 并行执行:迭代在多个线程上同时运行。
  • 线程池依赖:它利用线程池;您不直接管理线程的创建或生命周期。
  • 同步操作(默认): 执行会阻塞,直到处理完整个集合。
  • CPU 密集型任务优化: 最适合线程独立运行的 CPU 密集型操作。

示例:

<code class="language-csharp">using System;
using System.Threading.Tasks;

class Program
{
    static void Main(string[] args)
    {
        var items = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

        Parallel.ForEach(items, item =>
        {
            // Simulate CPU-intensive task (e.g., complex calculation)
            Console.WriteLine($"Processing item: {item} on thread {Task.CurrentId}");
        });

        Console.WriteLine("All items processed.");
    }
}</code>
登录后复制
登录后复制

任务(Task.Run、Task.WhenAll):

Task.RunTask.WhenAll 提供对异步和并行执行的精细控制。虽然 Task.Run 可以卸载 CPU 密集型工作,但它经常与 I/O 密集型任务的异步代码配合使用。

主要特点:

  • 异步执行:任务主要处理异步编程,尤其是 I/O 密集型操作(网络调用、数据库访问)。
  • 任务管理:手动创建、管理和等待任务(使用Task.WhenAllTask.WhenAny)。
  • 增强的灵活性:可以单独或分组创建和管理任务,提供细粒度的控制。
  • I/O 密集型任务优化: 虽然可用于 CPU 密集型任务,但 Task.Run 在需要异步行为的场景中表现出色。

示例:

<code class="language-csharp">using System;
using System.Threading.Tasks;

class Program
{
    static void Main(string[] args)
    {
        var items = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

        Parallel.ForEach(items, item =>
        {
            // Simulate CPU-intensive task (e.g., complex calculation)
            Console.WriteLine($"Processing item: {item} on thread {Task.CurrentId}");
        });

        Console.WriteLine("All items processed.");
    }
}</code>
登录后复制
登录后复制

键差总结:

功能 并行 task.run / task.whenall
Feature Parallel.ForEach Task.Run / Task.WhenAll
Primary Use Case Parallel iteration for CPU-bound tasks. Asynchronous and parallel execution (CPU/I/O).
Thread Control Less control; uses the thread pool. Full control over task creation and execution.
Execution Type Synchronous (blocking). Asynchronous (non-blocking unless awaited).
Task Type CPU-bound tasks (parallel for loop). General-purpose tasks (CPU-bound or I/O-bound).
Parallelism Parallelism Parallel or asynchronous.
Error Handling Exceptions thrown per iteration. Task.WhenAll aggregates exceptions.
Performance Automatic performance tuning. Manual task distribution management.
主要用例
针对CPU结合任务的并行迭代。 异步和并行执行(cpu/i/o)。

线程控制

较少的控制;使用线程池。 完全控制任务创建和执行。 执行类型 同步(阻止)。 异步(除非等待)。
    任务类型
cpu结合任务(循环平行)。 通用任务(CPU绑定或I/O-BOND)。

并行性 并行或异步。 错误处理Parallel.ForEach 例外情况下案。 汇总异常。 性能
自动性能调整。 手动任务分配管理。
  • 选择合适的工具:
  • >
  • >使用

    >:Task.Run> Task.WhenAll 您将CPU结合的任务分为独立的工作单位。

    >跨多个线程的自动并行化。
      >同步执行是可以接受的。
    • >
    • >使用
    /
  • 何时:

    i/o绑定的任务涉及。

    需要对任务管理,取消或同步的颗粒状控制。Parallel.ForEach> Task.Run需要结合并行性和异步。Task.WhenAll>

    结论: 非常适合直接控制CPU的任务,需要最小的控制。 >和提供了更大的灵活性,使其非常适合CPU结合和I/O结合任务,从而使并发和并行性与细粒度控制的结合。

    以上是任务和并行的详细内容。更多信息请关注PHP中文网其他相关文章!

    来源:php.cn
    本站声明
    本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
    作者最新文章
    热门教程
    更多>
    最新下载
    更多>
    网站特效
    网站源码
    网站素材
    前端模板