Parallel.ForEach 未生成所有线程

2024-01-03

我在使用 Parallel.ForEach 时遇到一些问题。 我需要模拟几个硬件组件,等待传入连接并回复它。

我当前的代码如下:

Task.Factory.StartNew(() => components, (component) =>
    {
        var listener = new TcpListener(component.Ip, component.Port);
        while(true)
        {
            using(var socket = listener.AcceptSocket())
            {
                 //Read out socket and send a reply
                 socket.Close();
            }
        }
    });

我遇到的问题是:并非每个组件都会创建自己的线程。 即使其中一个线程退出,它们仍然不会产生。

我的集合中当前组件的数量是 40,生成的线程数量是(或者至少看起来是)33。

我的印象是 Parallel.Foreach() 将为传递给它的可枚举集合创建一个新的并行线程。

有什么想法我做错了吗?


它不一定会立即启动每个任务的所有线程。它会检查其工作负载并在处理器的所有核心上进行配置。如果您的任务多于核心,它将停止创建新线程,因为这只会导致大量不必要的上下文切换。但是,如果它认为现有任务/线程被阻止,在这种情况下,它会添加更多线程以便工作可以继续,即启动更多任务,而其他任务被阻止。它不会检测短时间内被阻止的任务。

这可能解释了为什么您没有看到与任务一样多的线程。当任务完成时,系统可以重新使用它所在的线程来放置一个新的、尚未启动的任务。

本博文底部的图表在一定程度上粗略地说明了这一点:http://colinmackay.co.uk/2011/02/08/parallelization-in-net-40-part-1-looping/ http://colinmackay.co.uk/2011/02/08/parallelisation-in-net-40-part-1-looping/。运行最多 4 个任务所需的时间与运行 1 个任务所需的时间大致相同。然后,当添加第 5 个任务时会出现跳转,并且完成所需的时间大致相同,直到第 8 个任务再次跳转时。这是因为我使用的是 4 核系统。

UPDATE

刚刚意识到你的代码永远不会退出任务,因为那里有一个无限循环。我想说任务(离散的工作单元)不是你想要的。除非您专门从任务并行库中获取其他内容,否则在这种情况下,自己使用常规线程可能是更好的解决方案。

对于任务,您几乎无法控制何时创建线程或一次创建多少个线程。 (如果您要从 TPL 获取其他想要保留的内容,您可以编写自己的调度程序来控制这一点)。但是,如果您只是启动一个后台线程,在应用程序的整个生命周期中不断侦听内容,那么我仍然会使用常规线程。

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

Parallel.ForEach 未生成所有线程 的相关文章

随机推荐

  • Spring Boot 2.Hikari连接池优化

    我有一个 SpringBoot 应用程序 我正在控制器中进行一些性能测试 我意识到无论我放入控制器的第一个查询是什么 与其他查询相比都需要很长时间 数据库是远程连接 但我无法改变这一点 long t1 System nanoTime men
  • 如何将 YouTube API 持续时间转换为秒? [复制]

    这个问题在这里已经有答案了 为了兴趣 我想转换 YouTube 的视频时长ISO 8601到秒 为了将来证明我的解决方案 我选择了一个很长的视频 http www youtube com watch v 2XwmldWC Ls来测试它 AP
  • 使用 useState React hook 时从状态获取空数据

    我偶然发现了 useState 范围的问题 我正在尝试创建一个动态引导表单 用户可以在其中向组添加更多行 这些行将包含与能源相关的数据 因此 当我添加 2 行并开始更改输入值时 输入环境数据函数触发空数据 最后一个console log 我
  • Node js 对象导出

    有一个非常简单的问题 我找不到关于从 Node js 中的模块导出对象的答案 更具体地说是访问对象属性 这是我导出的对象 exports caravan month july 这是我的主要模块 var caravan require car
  • Invoke-Command 和直接查询的区别

    我目前正在编写一个从服务器查询磁盘信息的脚本 我遇到了一个问题 我真的不知道这里发生了什么 愿你能帮助我 以下代码有效 已替换 ComputerName space1 Invoke Command ComputerName xxxxxx S
  • 测试值是否存在于多个列表中

    我想检查每个列表中是否存在某个值 以下返回True正如预期的那样 但似乎不符合Python风格 正确 更优雅的方法是什么 a 1 2 b 1 3 c 1 4 d 2 5 False in True if 1 in l else False
  • iOS 8.3 打破了自动单元格高度

    长期读者 第一次海报 我在我的应用程序中使用自动单元格高度和自动布局 在 iOS 8 3 和 8 4 中 这一点似乎被打破了 我有一个示例项目 当内置于 8 2 或更低版本时 它可以正常工作 单元格高度由自动布局确定 当内置于 8 3 或
  • PHP gettext() 挪威语

    我正在使用 PHPgettext 简单地将网站转换为其他语言 到目前为止 该解决方案运行良好 英语 匈牙利语 因为我需要将挪威语翻译添加到新网站 当我设置挪威语言环境时setlocale LC ALL nb NO ISO8859 1 get
  • 更改条形图中条形的宽度 (R)

    我想知道如何更改 barchart 函数中条形的宽度 这是代码 rater1 lt c 0 75 0 66 0 73 0 63 barplot rater1 ylim c 0 1 axes TRUE names arg c A B C D
  • gcc给linux ELF添加了哪些功能?

    当用 c 或 asm 链接一个类似 helloworld 的程序时gcc它会将一些内容添加到结果可执行目标文件中 我只知道运行时动态链接器和 start但这些添加的功能是什么样的入口点呢 00000000004003f0 t deregis
  • 如何正确使用 axios params 和数组

    如何向查询字符串中的数组添加索引 我尝试像这样发送数据 axios get myController myAction params storeIds 1 2 3 我得到了这个网址 http localhost api myControll
  • JavaScript:获取数组中的平均对象?

    我试图想出一种方法来使代码变得简单 使用最少的循环和变量 但我遇到了麻烦 我想根据 值 获取数组 数字 中的平均对象 我觉得必须有一种数学方法来获得平均值 而无需在另一个循环中找到最接近的平均值 目前我有这个混乱 var numbers v
  • 无法在 Jenkins Pipeline 中显示 JUnit 测试结果

    我有一段 Jenkins 管道代码 我试图在我的角度代码上运行 JUnit 如果单元测试失败 Jenkins 必须停止管道 它正在工作 只是我看不到 最新测试结果 和 测试结果趋势 我正在使用 Jenkins 2 19 1 Jenkins
  • 导入 CSV 时选择指定行

    我有一个很大的 CSV 文件 我只想导入选择某些行 如果有 首先 我创建将导入的行的索引 然后我希望将这些行的名称传递给 sqldf 并返回指定行的完整记录 create the random rows ids that will be s
  • 安卓Mipmap?

    每当我尝试使用 AndroidStudio 生成新的 Android 项目时 它都会隐藏文件夹 drawables 我以前从未发生过这种情况 我环顾四周 发现它正在生成这个名为 mipmap 的文件夹 我搜索了一下 发现这与绘图类似 但这是
  • 尝试使用 woocommerce_new_order_item 挂钩保存订单项元数据

    Add meta to order item param int item id param array values return void function cart add meta data booking item id valu
  • 使用 Wikimedia API 获取位置

    如何使用 Mediawiki API 获取 Wikipedia 文章的城市 国家位置 假设我想确定圣家族大教堂位于哪个国家 哪个城市 我应该使用什么属性 尝试以下查询 And see 扩展 地理数据 https www mediawiki
  • React Router v4 中的嵌套路由

    我正在尝试设置一些嵌套路由来添加通用布局 检查一下代码
  • 在应用程序购买测试帐户无法在 IOS 中运行?

    我们正在使用沙盒测试帐户测试应用程序购买 在测试时它显示验证 在验证付款信息后 当我尝试在应用程序购买中测试时 它会将我重定向到应用程序商店 应用程序商店显示超时 我做错了什么吗 我还创建了另外三个沙箱测试帐户 用于在应用程序购买中进行测试
  • Parallel.ForEach 未生成所有线程

    我在使用 Parallel ForEach 时遇到一些问题 我需要模拟几个硬件组件 等待传入连接并回复它 我当前的代码如下 Task Factory StartNew gt components component gt var liste