在 PLINQ 中绑定源线程

2024-02-03

我有一个使用 PLINQ 并行化的计算,如下所示:

  • Source IEnumerable<T> source正在提供从 a 读取的对象 文件。

  • 我有一个重量级计算HeavyComputation我需要做 每个T,我希望这些通过线程进行外包,所以我 使用 PLINQ 如下:AsParallel().Select(HeavyComputation)

这就是有趣的地方:由于文件的限制 提供的读卡器类型source, 我需要source成为 在初始线程上枚举,而不是在并行工作线程上枚举。我需要 的全面评价source to be bound到主要 线。然而,似乎来源实际上是在工人身上枚举的 线程。

我的问题是:有没有一种直接的方法来修改这段代码 绑定枚举source到初始线程,同时 将繁重的工作分担给并行工人?请记住 只是做一个热切的事.ToList()之前AsParallel()在这里不是一个选项, 因为来自文件的数据流很大。

下面是一些示例代码,演示了我所看到的问题:

using System.Threading;
using System.Collections.Generic;
using System.Linq;
using System;

public class PlinqTest
{
    private static string FormatItems<T>(IEnumerable<T> source)
    {
            return String.Format("[{0}]", String.Join(";", source));
    }

    public static void Main()
    {
        var expectedThreadIds = new[] { Thread.CurrentThread.ManagedThreadId };

        var threadIds = Enumerable.Range(1, 1000)
                .Select(x => Thread.CurrentThread.ManagedThreadId) // (1)
                .AsParallel()
                .WithDegreeOfParallelism(8)
                .WithExecutionMode(ParallelExecutionMode.ForceParallelism)
                .AsOrdered()
                .Select(x => x)                                    // (2)
                .ToArray();

        // In the computation above, the lambda in (1) is a
        // stand in for the file-reading operation that we
        // want to be bound to the main thread, while the
        // lambda in (2) is a stand-in for the "expensive
        // computation" that we want to be farmed out to the
        // parallel worker threads.  In fact, (1) is being
        // executed on all threads, as can be seen from the
        // output.

        Console.WriteLine("Expected thread IDs: {0}",
                          FormatItems(expectedThreadIds));
        Console.WriteLine("Found thread IDs: {0}",
                          FormatItems(threadIds.Distinct()));
    }
}

我得到的示例输出是:

Expected thread IDs: [1]
Found thread IDs: [7;4;8;6;11;5;10;9]

如果您放弃 PLINQ 并仅显式使用任务并行库,那么这相当简单(尽管可能不那么简洁):

// Limits the parallelism of the "expensive task"
var semaphore = new SemaphoreSlim(8);

var tasks = Enumerable.Range(1, 1000)
    .Select(x => Thread.CurrentThread.ManagedThreadId)
    .Select(async x =>
    {
        await semaphore.WaitAsync();
        var result = await Task.Run(() => Tuple.Create(x, Thread.CurrentThread.ManagedThreadId));
        semaphore.Release();

        return result;
    });

return Task.WhenAll(tasks).Result;

请注意,我正在使用Tuple.Create记录来自主线程的线程 ID 和来自派生任务的线程 ID。根据我的测试,前者对于每个元组总是相同的,而后者则不同,这是应该的。

信号量确保并行度永远不会超过 8(尽管创建元组的成本较低,但这种情况不太可能发生)。如果达到 8,任何新任务都将等待,直到信号量上有可用的位置。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 PLINQ 中绑定源线程 的相关文章

  • std::cout 和 std::wcout 有什么区别?

    在c 中 有什么区别std cout and std wcout 它们都控制流缓冲区的输出或将内容打印到控制台 或者它们只是相似吗 它们作用于不同的字符类型 std cout uses char作为字符类型 std wcout uses w
  • 从“VisitLambda”调用时,重写“System.Linq.Expressions.ParameterExpression”类型的节点必须返回相同类型的非空值

    我将数据层类库项目从 NET Core 2 2 升级到 NETCore3 1 并将 EntityFrameWork Core 等 Nuget 包从 2 2 0 升级到 EFCore 3 1 0 然后我在验证以下代码时收到如下错误 Code
  • 如何为 C 分配的 numpy 数组注册析构函数?

    我想在 C C 中为 numpy 数组分配数字 并将它们作为 numpy 数组传递给 python 我可以做的PyArray SimpleNewFromData http docs scipy org doc numpy reference
  • 存储来自其他程序的事件

    我想将其他应用程序的事件存储在我自己的应用程序中 事件示例 打开 最小化 Word 或打开文件时 这样的事可能吗 运行程序 http msdn microsoft com en us library ms813609 aspx and 打开
  • 用于检查项目文件中的项目变量和引用路径的 api

    我正在研究一个 net application VS2010 与 x 没有 解和变量号这些解决方案中的项目数量 我需要检查项目属性 特定于一定数量的项目 是否同质 并且检查 验证构建期间的参考路径 有没有一个API是这样的吗 如果没有 我该
  • 获取 WPF 控件的所有附加事件处理程序

    我正在开发一个应用程序 在其中动态分配按钮的事件 现在的问题是 我希望获取按钮单击事件的所有事件 因为我希望删除以前的处理程序 我尝试将事件处理程序设置为 null 如下所示 Button Click null 但是我收到了一个无法分配 n
  • 单击 form2 上的按钮触发 form 1 中的方法

    我对 Windows 窗体很陌生 我想知道是否可以通过单击表单 2 中的按钮来触发表单 1 中的方法 我的表格 1 有一个组合框 我的 Form 2 有一个 保存 按钮 我想要实现的是 当用户单击表单 2 中的 保存 时 我需要检查表单 1
  • 未经许可更改内存值

    我有一个二维数组 当我第一次打印数组的数据时 日期打印正确 但其他时候 array last i 的数据从 i 0 到 last 1 显然是一个逻辑错误 但我不明白原因 因为我复制并粘贴了 for 语句 那么 C 更改数据吗 I use g
  • C++:.bmp 到文件中的字节数组

    是的 我已经解决了与此相关的其他问题 但我发现它们没有太大帮助 他们提供了一些帮助 但我仍然有点困惑 所以这是我需要做的 我们有一个 132x65 的屏幕 我有一个 132x65 的 bmp 我想遍历 bmp 并将其分成小的 1x8 列以获
  • 如何使用 watin 中的 FileUploadDialogHandler 访问文件上传对话框

    我正在使用 IE8 和 watin 并尝试通过我的网页测试上传文件 我不能简单地使用 set 方法设置上传文件 例如 ie FileUpload Find ById someId Set C Desktop image jpg 因为上传文本
  • Python 队列 get()/task_done() 问题

    我的消费者端队列 m queue get queue task done
  • 如何使用 Mongodb C# 驱动程序连接多个集合

    我需要将 3 个集合与多个集合合并在一起 lookup我在 C 驱动程序中尝试过 它允许我 lookup用户采集但无法执行秒 lookup用于设置集合 有人可以帮忙吗 db Transactions aggregate lookup fro
  • 如何编写一个同时需要请求和响应Dtos的ServiceStack插件

    我需要提供本地化数据服务 所有本地化的响应 Dto 都共享相同的属性 IE 我定义了一个接口 ILocalizedDto 来标记那些 Dto 在请求端 有一个ILocalizedRequest对于需要本地化的请求 Using IPlugin
  • 等待线程完成

    private void button1 Click object sender EventArgs e for int i 0 i lt 15 i Thread nova new Thread Method nova Start list
  • 如何从main方法调用业务对象类?

    我已将代码分为业务对象 访问层 如下所示 void Main Business object public class ExpenseBO public void MakeExpense ExpensePayload payload var
  • .NET中的LinkedList是循环链表吗?

    我需要一个循环链表 所以我想知道是否LinkedList是循环链表吗 每当您想要移动列表中的 下一个 块时 以循环方式使用它的快速解决方案 current current Next current List First 电流在哪里Linke
  • C++ 密码屏蔽

    我正在编写一个代码来接收密码输入 下面是我的代码 程序运行良好 但问题是除了数字和字母字符之外的其他键也被读取 例如删除 插入等 我知道如何避免它吗 特q string pw char c while c 13 Loop until Ent
  • 线程和 fork()。我该如何处理呢? [复制]

    这个问题在这里已经有答案了 可能的重复 多线程程序中的fork https stackoverflow com questions 1235516 fork in multi threaded program 如果我有一个使用 fork 的
  • memset 未填充数组

    u32 iterations 5 u32 ecx u32 malloc sizeof u32 iterations memset ecx 0xBAADF00D sizeof u32 iterations printf 8X n ecx 0
  • 检查Windows控制台中是否按下了键[重复]

    这个问题在这里已经有答案了 可能的重复 C 控制台键盘事件 https stackoverflow com questions 2067893 c console keyboard events 我希望 Windows 控制台程序在按下某个

随机推荐

  • Selenium 缓慢向下滚动

    我正在尝试使用 Python 在 javascript 渲染的网页上进行动态网页抓取 1 但是 只有当我缓慢向下滚动页面时 才会加载元素 我努力了 driver execute script window scrollTo 0 Y 这不起作
  • 如何对 numberDisplay 的所有值求和,不包括类别

    我有一组数据 我想默认将过滤器应用到 numberDisplay 数据是这样的 data category A value 10 category B value 10 category C value 10 category S valu
  • 检查 linq 中的字符串是否为 null 或为空

    我有一个带有空格的字符串 string MyNote Convert ToString Session MyNote if MyNote null MyNote 如果字符串有更多空间 MyNote 不起作用 所以 如何在 C 中使用 lin
  • 从非模板参数化方法返回模板类型

    为了定义模板类 我考虑了三个不同的文件 该声明位于 h文件中 方法实现位于 cpp文件 并且显式实例化包含在 inc文件 通过在 cpp 末尾添加一行 例如 include bar impl inc 现在 这是我的问题 我有两个模板类 例如
  • ActiveMQ从java中删除队列

    如何从java程序中删除activemq中的队列 有类似 session delelteQueue 的东西吗 谢谢M 简单的解决方案 不使用 JMX 将连接转换为 ActiveMQConnection 并使用其 destroyDestina
  • 寻求报告服务认证建议

    我被分配负责修订当前的报告服务验证流程 目的是保持必要的安全级别 并简化授予对各个报告的访问权限的维护 配置 我无权访问域控制器来修改或创建新的 AD 组 我必须与当前存在的组 用户合作 在身份验证方面 我似乎可以选择使用以下任一方法 Wi
  • -Webkit滚动条+溢出+JQuery滚动顶部始终返回零

    我一整天都在研究这个错误 但无法解决它 有一个 JQuery scrollTop 动画脚本 它检测 window scrollTop 值并执行一些动画 如果单击按钮滚动回顶部 this click 函数 html body animate
  • C 中的守护进程 - 有没有一种方法可以实现它们?

    我有一个关于 C 中守护进程的一般性问题 但到目前为止我还没有看到答案 有没有一种方法可以实现对守护进程的控制 例如约定或标准 休息是进一步的解释 我看过多个文档 教授如何在 C 中创建守护进程的基础知识 分叉 关闭文件描述符 更改根目录等
  • 下载文件存储位置和处理使用selenium webdriver和JAVA下载弹出窗口

    请提出一个想法 并进行以下几点实施 1 how to handle the Download popup in IE with Selenium Webdriver with JAVA 2 如何使用JAVA将该xml文件存储在不同的位置 注
  • “响应?”与“响应缺失?”

    定义的意义何在respond to missing 而不是定义respond to 如果重新定义会出现什么问题respond to 某堂课 Without respond to missing http ruby doc org core
  • bash - 导出不起作用

    我错过了一些非常基本的东西 在 Mac OS X 下 我尝试过 chmod 0777 setdir bsh 一定是我的设置有问题 bin bash export proj Users RParadox projects testprojec
  • JButton 文本的抗锯齿

    我在用着字体真棒 http fortawesome github io Font Awesome icon arrow circle left 在 JButton 中创建可单击的图标 但是当尺寸较小时 生成的图标会出现别名 只是作为一点背景
  • 架构 x86_64 的 1 个重复符号

    我不确定我做错了什么 我将项目文件夹移动到另一个文件夹 并将备份文件夹复制到桌面 我尝试打开备份项目并构建 但收到链接器错误 因此 我决定删除备份文件夹并将项目文件夹移回桌面 我无法再编译并收到以下错误 Showing Recent Iss
  • 生成图像的 Base64 字符串以在数据 URI 中使用

    如何生成图像的 Base64 字符串以在数据 URI 中使用 我有一个 Base64 图像编码问题 希望有人可以帮助解决 我正在尝试在我的网页中使用数据 uri 即 img src with org apache commons codec
  • 滞后函数获取最后一个不同的值(redshift)

    我有如下示例数据 想要获得所需的 O P 请帮我一些想法 我希望第 3 4 行的 prev diff value 的 o p 为2015 01 01 00 00 00代替2015 01 02 00 00 00 with dat as sel
  • 如何为所有 div 的每一侧提供相同的空间

    您好 我有一个关于布局的问题 我有一个网站 我在 div 中填充信息 这些 Div 需要彼此相邻 它们之间以及容器 div 两侧之间的空间大小相同 我正在为手机制作它 所以我不知道屏幕的宽度 它应该在所有不同的屏幕分辨率上看起来都很好 目前
  • 使用 Ninject 工厂方法将 IEnumerable 注入到构造函数中

    我正在尝试注入IEnumerable使用 Ninject 进入构造函数 我的构造函数如下所示 public MatrixViewModel IEnumerable
  • 我怎样才能对我的整个 git 历史记录进行 clang 格式?

    我现在已经完成了我的一个小图书馆 当我开始使用它时 我不知道 clang format 现在我想用它格式化整个存储库 我知道随着提交哈希值的变化 这会破坏其他人的存储库 然而 由于还没有人使用我的图书馆 这对我来说没问题 因此 我必须做什么
  • 基于 NetBeans 平台构建的 Web Start 应用程序不会创建桌面快捷方式和开始菜单项

    我创建了一个使用 Java Web Start 启动的 NetBeans 平台应用程序 我使用 Netbeans 6 8 中的 Build JNLP Application 命令构建了 WAR 文件 我已将桌面快捷方式和菜单项添加到 JNL
  • 在 PLINQ 中绑定源线程

    我有一个使用 PLINQ 并行化的计算 如下所示 Source IEnumerable