防止并行操作按顺序批量执行

2024-03-05

我有 8 个逻辑处理器。当执行以下代码时

public void test()
{
    Parallel.For(1, 1001, i => { IntensiveWork(i); });
}

private static void IntensiveWork(int i)
{
    Random r = new Random();
    Thread.Sleep(r.Next(i * 1));
}

我注意到Parallel.For进行多批 8 个作业。每个批次将按顺序执行。这里的问题是,如果该批次中的 7/8 个作业完成,那么下一个批次将继续等待最后一个作业完成。这意味着7个核心不会很忙。有没有更好的方法来实现并行性,即 C#,一旦批处理中的一个作业完成,它就会为该核心分配另一个作业。


您可以创建多个任务将从中读取的单个队列。

static void test()
{
    ConcurrentQueue<int> queue = new ConcurrentQueue<int>(Enumerable.Range(1, 1000));
    int taskCount = Environment.ProcessorCount;
    Task[] tasks = new Task[taskCount];
    for (int taskIndex = 0; taskIndex < taskCount; taskIndex++)
    {
        Task task = Task.Factory.StartNew(() => IntensiveWorkTask(queue));
        tasks[taskIndex] = task;
    }
    Task.WaitAll(tasks);
}

private static void IntensiveWorkTask(ConcurrentQueue<int> queue)
{
    while (queue.TryDequeue(out int value))
        IntensiveWork(value);
}

private static void IntensiveWork(int i)
{
    Random r = new Random();
    Thread.Sleep(r.Next(i * 1));
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

防止并行操作按顺序批量执行 的相关文章

随机推荐

  • ld-linux --验证退出代码

    检查 usr bin ldd 的源代码 我发现它使用 ld linux 来查找可执行文件的依赖项 尽管它首先使用 verify 参数调用 ld linux 然后 脚本根据 ld linux verify 调用的退出代码采取不同的行为 ld
  • HTML5画布,保存jpeg blob并从blob恢复到画布

    我有一块画布 mycanvas其中包含图像 我想从该图像创建一个斑点 最好是 jpeg 格式 这是我创建 blob 的方法 document getElementById mycanvas toDataURL image jpeg repl
  • 比较数组与 jQuery [重复]

    这个问题在这里已经有答案了 可能的重复 javascript中数组交集的最简单代码 https stackoverflow com questions 1885557 simplest code for array intersection
  • 检查 TCP 端口是否可用(未侦听或连接)

    我使用以下代码来检查端口是否可用 bool ClassA CheckPortTCP short int dwPort char ipAddressStr struct sockaddr in client int sock client s
  • 在 C# 中调用 google Url Shortener API

    我想打电话给谷歌网址缩短API http code google com apis urlshortener v1 getting started html从我的 C 控制台应用程序中 我尝试实现的请求是 POST https www go
  • Firestore - 查询时如何在字段上应用“字符串包含”条件?

    Collection Post postId post 124 title World population 2020 如何编写一个查询 返回 标题 字段中包含字符串 世界人口 的帖子 Firestore 不支持此级别的查询 看全文检索 h
  • 从 iOS 应用程序检测附近的移动设备

    是否可以创建一个 iOS 应用程序来扫描附近的移动设备 例如 iPhone Android iPad 等 而无需在附近的移动设备上运行任何自定义应用程序 我尝试过像这样使用 CoreBluetooth 在我的 iPhone 6 上运行 se
  • 如何创建数据类型不是 EMF 类的 EAttribute?

    使用 EMF 我想定义一个属性 其数据类型 EType 在我的 EMF 模型外部 也就是说 我想要的类型是一个普通的手工编码的 Java 类 它不是我的 EMF 模型的一部分 使用AnySimpleType是最后的手段 与使用泛型相比 我想
  • 从一个线程跟踪另一个线程

    进行实验ptrace 系统调用 我试图跟踪同一进程的另一个线程 根据手册页 跟踪器和被跟踪者都是特定的线程 而不是进程 所以我看不出它不应该工作的原因 到目前为止 我已经尝试了以下方法 use PTRACE TRACEME来自clone d
  • 读取会话变量而不使上下文无效

    有没有办法在会话变量发生变化时读取会话变量而无需重新渲染模板 场景 我使用 jQuery 动态更改元素的样式 但是当创建新元素时 我想设置其默认样式 我知道在渲染元素时我可以调用相同的 jQuery 命令 Example
  • C# Visual Studio 如何重新定位 nuget 包文件夹?

    我聘请了一名承包商为我做一些编码 他使用以下存储库路径在解决方案文件夹中设置 nuget config
  • 在 Heroku 中使用特殊字符设置环境变量(通过 powershell)

    Django 1 8 Heroku Powershell 我正在尝试在 Heroku 中为 django 密钥设置环境变量 venv PS WORKFOLDER gt heroku config set SECRET KEY eoik6 d
  • 改变UIView位置的简单方法?

    我使用以下代码更改 UIView 的位置 而不更改视图的大小 CGRect f aView frame f origin x 100 new x f origin y 200 new y aView frame f 有没有更简单的方法来仅更
  • 文本二值化

    I d like to binarize this image to use it with tesseract ocr Currently I managed to get this But I need clear image with
  • SQL Server 2008 Nvarchar(Max) 连接 - 截断问题

    有人可以解释一下为什么在 SQL Server 2008 上会发生这种情况吗 declare sql Nvarchar max set sql N select sql sql replicate a 4000 replicate b 60
  • 使用 Python 请求传递登录名/密码

    我查看了相关答案 但没有找到非常有效的东西 我正在尝试从我的球队的 CBS Sportsline 页面上抓取一些梦幻棒球信息 我想发布登录名和密码 然后当我使用 get 命令时 查看特定于我的帐户的数据 这是我尝试过的 import req
  • 发送对象时忽略 JSON 字段(反序列化)

    我有一个 DTO 对象 public class Rate private final Integer rate private final String user private final Date date 和两个控制器 https
  • 正确处理浏览器资源

    我有一个网络应用程序 可以在很长一段时间内动态加载数据 数据内有图像的链接 然后在浏览器中呈现这些图像 e g var object Name ko observable Foo Ref ko observable Bar ImageUrl
  • ASP.NET MVC Web 应用程序中视图逻辑和域逻辑之间的混淆

    我对域 应用程序逻辑和用户界面逻辑感到困惑 为了说明我想要确定的内容 我将在下面描述一个虚构的程序以供说明 1 想象一个带有一组 3 个级联下拉菜单的小型应用程序 当您选择一个下拉列表时 它会触发 jQuery Ajax GET 最终到达
  • 防止并行操作按顺序批量执行

    我有 8 个逻辑处理器 当执行以下代码时 public void test Parallel For 1 1001 i gt IntensiveWork i private static void IntensiveWork int i R