IO 绑定操作的并行执行

2023-12-31

我已从头到尾阅读了 TPL 和任务库文档。但是,我仍然无法非常清楚地理解以下案例,现在我需要实现它。

我将简化我的情况。我有一个IEnumerable<Uri>长度为 1000。我必须使用HttpClient.

我有两个问题。

  1. 没有太多的计算,只是等待Http请求。在这种情况下我还可以使用Parallel.Foreach() ?
  2. 如果使用Task相反,创建大量它们的最佳实践是什么?假设我用Task.Factory.StartNew()并将这些任务添加到列表中并等待所有任务。是否有控制最大任务数和最大任务数的功能(例如 TPL 分区器)HttpClient我可以创造吗?

SO 有几个类似的问题,但没有人提到maximums。要求只是使用最多的任务和最多的 HttpClient。

先感谢您。


i3arnon 对 TPL Dataflow 的回答很好;数据流非常有用,尤其是当您混合使用 CPU 和 I/O 绑定代码时。我会回应他的观点Parallel专为 CPU 密集型代码而设计;它不是基于 I/O 的代码的最佳解决方案,并且尤其不适合异步代码。

如果您想要一种能够与大多数 I/O 代码配合良好且不需要外部库的替代解决方案,那么您正在寻找的方法是Task.WhenAll:

var tasks = uris.Select(uri => SendRequestAsync(uri)).ToArray();
await Task.WhenAll(tasks);

这是最简单的解决方案,但它确实存在同时启动所有请求的缺点。特别是如果所有请求都发送到同一服务(或一小组服务),这可能会导致超时。为了解决这个问题,你需要使用某种节流......

是否有功能(例如 TPL 分区程序)可以控制我可以创建的最大任务数和最大 HttpClient 数量?

TPL Dataflow 很好MaxDegreeOfParallelism一次只能启动这么多。您还可以使用另一个内置函数来限制常规异步代码,SemaphoreSlim:

private readonly SemaphoreSlim _sem = new SemaphoreSlim(50);
private async Task SendRequestAsync(Uri uri)
{
  await _sem.WaitAsync();
  try
  {
    ...
  }
  finally
  {
    _sem.Release();
  }
}

如果使用任务,创建大量任务的最佳实践是什么?假设我使用 Task.Factory.StartNew() 并将这些任务添加到列表中并等待所有任务。

你实际上不想使用StartNew。它只有一种合适的用例(基于动态任务的并行性),这是极其罕见的。现代代码应该使用Task.Run如果您需要将工作推到后台线程上。但你一开始就不需要它,所以也不需要StartNew nor Task.Run放在这里是合适的。

关于 SO 有几个类似的问题,但没有人提到最大值。要求只是使用最多的任务和最多的 HttpClient。

最大值是异步代码真正变得棘手的地方。对于受 CPU 限制的(并行)代码,解决方案是显而易见的:您可以使用与内核一样多的线程。 (好吧,至少你可以start并根据需要进行调整)。对于异步代码,没有那么明显的解决方案。这取决于很多因素——你有多少内存、远程服务器如何响应(速率限制、超时等)等等。

这里没有简单的解决方案。您只需测试您的特定应用程序如何处理高级别并发性,然后限制到较低的数字。


我有一些演讲幻灯片 https://github.com/StephenCleary/Presentations/tree/a406324f894da3ca50676e7b3f5bd40dc3078061/Asynchronous%20Parallel%20Reactive%20-%20HELP!试图解释不同技术何时适用(并行、异步、TPL 数据流和 Rx)。如果您更喜欢更多带有食谱的书面描述,我认为您可能会受益my book http://stephencleary.com/book/关于并发。

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

IO 绑定操作的并行执行 的相关文章

  • boost::multi_index_container 复合键中的 equal_range 与比较运算符

    我正在尝试从多索引容器查询结果 其中值类型是三个元素的结构 第一个值已给出 但第二个和第三个值必须大于或小于查询参数 经过搜索后 我发现必须实现自定义密钥提取器 并且这里的一些链接建议相同 但我无法实现它 boost multi index
  • 如何在没有 Control.Invoke() 的情况下从后台线程修改控件属性

    最近 我们遇到了一些旧版 WinForms 应用程序 我们需要更新一些新功能 在专家测试该应用程序时 发现一些旧功能被破坏 无效的跨线程操作 现在 在您认为我是新手之前 我确实有一些 Windows 窗体应用程序的经验 我不是专家 但我认为
  • 嵌入式系统中的malloc [重复]

    这个问题在这里已经有答案了 我正在使用嵌入式系统 该应用程序在 AT91SAMxxxx 和 cortex m3 lpc17xxx 上运行 我正在研究动态内存分配 因为它会极大地改变应用程序的外观 并给我更多的力量 我认为我唯一真正的路线是为
  • 如何在我的应用程序中使用 Windows Key

    Like Windows Key E Opens a new Explorer Window And Windows Key R Displays the Run command 如何在应用程序的 KeyDown 事件中使用 Windows
  • 为什么禁止在 constexpr 函数中使用 goto?

    C 14 对你能做什么和不能做什么有规则constexpr功能 其中一些 没有asm 没有静态变量 看起来相当合理 但标准也不允许goto in constexpr功能 即使它允许其他控制流机制 这种区别背后的原因是什么 我以为我们已经过去
  • 写入和读取文本文件 - C# Windows 通用平台应用程序 Windows 10

    有用 但在显示任何内容之前 您必须在文本框中输入内容 我想那是因为我使用了 TextChanged 事件处理程序 如果我希望它在没有用户交互的情况下显示文本文件的内容 我应该使用哪个事件处理程序 因此 我想在按下按钮时将一些数据写入 C W
  • 如何针对 Nancy 中的 Active Directory 进行身份验证?

    这是一篇过时的文章 但是http msdn microsoft com en us library ff650308 aspx paght000026 step3 http msdn microsoft com en us library
  • 基于范围的 for 循环中的未命名循环变量?

    有没有什么方法可以不在基于范围的 for 循环中 使用 循环变量 同时也避免编译器发出有关未使用它的警告 对于上下文 我正在尝试执行以下操作 我启用了 将警告视为错误 并且我不想进行像通过在某处毫无意义地提及变量来强制 使用 变量这样的黑客
  • 为什么模板不能位于外部“C”块内?

    这是一个后续问题一个答案 https stackoverflow com questions 4866433 is it possible to typedef a pointer to extern c function type wit
  • 使用向量的 merge_sort 在少于 9 个输入的情况下效果很好

    不知何故 我使用向量实现了合并排序 问题是 它可以在少于 9 个输入的情况下正常工作 但在有 9 个或更多输入的情况下 它会执行一些我不明白的操作 如下所示 Input 5 4 3 2 1 6 5 4 3 2 1 9 8 7 6 5 4 3
  • 初始化变量的不同方式

    在 C 中初始化变量有多种方法 int z 3 与 int 相同z 3 Is int z z 3 same as int z z 3 您可以使用 int z z 3 Or just int z 3 Or int z 3 Or int z i
  • 可空属性与可空局部变量

    我对以下行为感到困惑Nullable types class TestClass public int value 0 TestClass test new TestClass Now Nullable GetUnderlyingType
  • AccessViolationException 未处理

    我正在尝试使用史蒂夫 桑德森的博客文章 http blog stevensanderson com 2010 01 28 editing a variable length list aspnet mvc 2 style 为了在我的 ASP
  • 检查 url 是否指向文件或页面

    我们需要以下内容 如果文件确实是文件 则从 URL 下载该文件 否则 如果它是一个页面 则什么也不做 举个简单的例子 我有以下命令来下载文件 My Computer Network DownloadFile http www wired c
  • 在 URL 中发送之前对特殊字符进行百分比编码

    我需要传递特殊字符 如 等 Facebook Twitter 和此类社交网站的 URL 为此 我将这些字符替换为 URL 转义码 return valToEncode Replace 21 Replace 23 Replace 24 Rep
  • char指针或char变量的默认值是什么[重复]

    这个问题在这里已经有答案了 下面是我尝试打印 char 变量和指针的默认值 值的代码 但无法在控制台上看到它 它是否有默认值或只是无法读取 ASCII 范围 include
  • 异步和协程与任务队列

    我一直在阅读有关 python 3 中的 asyncio 模块的内容 以及更广泛地了解 python 中的协程的内容 但我不明白是什么让 asyncio 成为如此出色的工具 我的感觉是 你可以用协程做的所有事情 通过使用基于多处理模块 例如
  • 窗体最大化时自动缩放子控件

    有没有办法在最大化屏幕或更改分辨率时使 Windows 窗体上的所有内容自动缩放 我发现手动缩放它是正确的 但是当切换分辨率时我每次都必须更改它 this AutoScaleDimensions new System Drawing Siz
  • 如何使用 ReactiveList 以便在添加新项目时更新 UI

    我正在创建一个带有列表的 Xamarin Forms 应用程序 itemSource 是一个reactiveList 但是 向列表添加新项目不会更新 UI 这样做的正确方法是什么 列表定义 listView new ListView var
  • C++ 成员函数中的“if (!this)”有多糟糕?

    如果我遇到旧代码if this return 在应用程序中 这种风险有多严重 它是一个危险的定时炸弹 需要立即在应用程序范围内进行搜索和销毁工作 还是更像是一种可以悄悄留在原处的代码气味 我不打算writing当然 执行此操作的代码 相反

随机推荐

  • 设置 UIView 的 self 背景颜色

    我正在尝试从自定义视图类的 m 内部执行此操作not从 XIB 加载 而是以编程方式加载 id initWithFrame CGRect frame self super initWithFrame frame if self Initia
  • 未找到 ${env.JAVA_HOME} - Ant

    在我的 build xml 文件中 我有以下几行
  • 在 MySQL 中正确实现超类型子类型

    下面是一个数据库图表 我试图在其中确定适当的设计 这里有一些注意事项 员工 经理与客户相关联 The partyid是一种在全球范围内代表一个人的方式 客户 员工 经理 需要一直向下传播吗 它应该是所有表中的主键还是仅代表个人的表中的主键
  • 无法解析方法 getMap()

    我试图让地图片段在我的应用程序中工作 但在尝试获取 GoogleMap 对象时仍然出现错误 FragmentWithMap java import android Manifest import android app Activity i
  • string::size_type 而不是 int

    const std string size type cols greeting size pad 2 2 Why string size type int应该可以工作 它包含数字 空头也能容纳数字 与签名字符一样 但这些类型都不能保证足够
  • 当委托构造函数抛出异常时,内存是否会自动回收?

    从此 当委托构造函数抛出异常时 析构函数是否被调用 https stackoverflow com q 17657761 14065 class X public X X int X throw std exception X double
  • 将 GitHub 文件(和更新)获取到 Ubuntu Web 服务器上

    我正在设置一个多用户 多服务器环境 所有开发人员都将使用 Git 并从 GitHub 等克隆各种存储库 在我控制的一个帐户中 现在 我如何将文件从 GitHub 获取到服务器 大约 5 个 首先 我正在考虑某种自动化方式将更新从 GutHu
  • SSRS 报告查看器 + ASP.NET 凭据 401 异常

    我在 SQL2005 报告服务器上保存了一份报告 我想返回该报告的渲染 PDF 我在使用本地 rdlc 文件时发现了这一点 我已经在博客上介绍过它 http www jarrettmeyer com 2009 09 reports in a
  • Jest - “child_process”包中的模拟函数

    我正在编写单元测试 并模拟包 child process 中的 exec 方法 mocks child process js const child process jest genMockFromModule child process
  • C 将内存部分移动到位

    我正在实现几个数据结构 我想要使用的一个原语如下 我有一个内存块 A N 它的长度可变 但我在示例中使用 100 在这个块内 有一个较小的部分C 长度为 K 假设为 30 我想在不使用任何额外内存的情况下移动它 额外的困难是 A 换行 即C
  • 打印地图中包含的集合的内容

    我正在编写一个程序 从文件中读取团队名称并将其分组 每组尺寸为 4 我使用的是 map
  • Eclipse 错误:解析 ...\android-22\android-wear\armeabi-v7a\devices.xml 时出错

    最近 我将 android SDK 升级为Android M API 22 MNC 预览版 之后每个项目打开Eclipse都报错 的错误为logcat and of 弹出窗口 says 错误 解析错误 sdk system images a
  • TaskScheduler.UnobservedTaskException 事件处理程序从未被触发

    我正在阅读一本有关 C 任务并行库的书 并有以下示例 但 TaskScheduler UnobservedTaskException 处理程序从未被触发 谁能给我任何线索来解释为什么 TaskScheduler UnobservedTask
  • 如何在 iOS 上启用新的 Objective-C 对象文字?

    当我使用 Xcode 4 4 创建一个新项目并添加以下行时 NSDictionary test key test value NSString value test key NSLog value is value 它编译时没有警告并按预期
  • jQuery 快速问题:停止事件传播?

    我有一组响应 mouseUp 事件的元素 其中的子元素也响应 mouseUp 事件 全部通过 jQuery 当用户鼠标单击发生子级的 mouseUp 事件时 如何才能使子级的父级 mouseUp 事件在 jQuery 中也不会发生 你要ev
  • 如何打印类型向量 > 来屏幕 C++?

    我有一个返回值向量 gt 的方法 但我不知道如何打印该向量的内容 我试图循环浏览内容 但出现编译器错误 这是我尝试过的一个例子 vector
  • SwiftUI 中根据文本高度自动调整视图高度

    我正在尝试在 SwiftUI 中创建一个视图 其中左侧图像的背景应根据右侧文本的高度垂直缩放 我尝试了很多不同的方法 从GeometryReader to layoutPriority 但我还没有设法让它们中的任何一个工作 当前状态 期望的
  • 向服务器发送 http 请求而不期待响应

    我需要向服务器发送 POST http 请求 但它不应该期待响应 我应该使用什么方法呢 我一直在使用 WebRequest request2 WebRequest Create http local ape project org 6969
  • 如何显示事务隔离级别(MySQL)

    我想知道当前Mysql数据库设置的隔离级别是什么 怎么才能查出来呢 我尝试在谷歌上搜索但没有找到 检查会话事务级别 mysql8 SELECT transaction ISOLATION 检查全局事务级别 mysql8 SELECT glo
  • IO 绑定操作的并行执行

    我已从头到尾阅读了 TPL 和任务库文档 但是 我仍然无法非常清楚地理解以下案例 现在我需要实现它 我将简化我的情况 我有一个IEnumerable