如何限制并发的 异步IO 请求数量?

咨询区

  • Grief Coder

我的项目中有下面一段代码:

// let's say there is a list of 1000+ URLs
string[] urls = { "http://google.com", "http://yahoo.com", ... };// now let's send HTTP requests to each of these URLs in parallel
urls.AsParallel().ForAll(async (url) => {var client = new HttpClient();var html = await client.GetStringAsync(url);
});

这段代码有一个问题,当我开启了 1000+ 的并发请求,是否有一种简便的方式限制这些 异步http请求 并发量,比如说实现同一时刻不会超过 20 个下载,请问我该如何去实现?

回答区

  • Jay Shah

可以使用 SemaphoreSlim,它可以非常完美的搞定,下面是我实现的扩展方法。

public static async Task ForEachAsyncConcurrent<T>(this IEnumerable<T> enumerable,Func<T, Task> action,int? maxActionsToRunInParallel = null){if (maxActionsToRunInParallel.HasValue){using (var semaphoreSlim = new SemaphoreSlim(maxActionsToRunInParallel.Value, maxActionsToRunInParallel.Value)){var tasksWithThrottler = new List<Task>();foreach (var item in enumerable){// Increment the number of currently running tasks and wait if they are more than limit.await semaphoreSlim.WaitAsync();tasksWithThrottler.Add(Task.Run(async () =>{await action(item).ContinueWith(res =>{// action is completed, so decrement the number of currently running taskssemaphoreSlim.Release();});}));}// Wait for all of the provided tasks to complete.await Task.WhenAll(tasksWithThrottler.ToArray());}}else{await Task.WhenAll(enumerable.Select(item => action(item)));}}

然后像下面这样使用。

await enumerable.ForEachAsyncConcurrent(async item =>{await SomeAsyncMethod(item);},5);
  • Serge Semenov

其实直接用 semaphore 稍不注意就会遇到很多的坑,而且排查起来还特别棘手,我建议你使用 AsyncEnumerator NuGet Package ,参考地址:https://www.nuget.org/packages/AsyncEnumerator/1.1.0  ,这样也不需要再造什么轮子了,参考如下代码:

using System.Linq;
using System.Buffers;
using Dasync.Collections;// let's say there is a list of 1000+ URLs
string[] urls = { "http://google.com", "http://yahoo.com"};// now let's send HTTP requests to each of these URLs in parallel
await urls.ParallelForEachAsync(async (url) => {var client = new HttpClient();var html = await client.GetStringAsync(url);
},maxDegreeOfParallelism: 20);

点评区

在异步上做并发限制要比同步复杂的多,不过也是有一些可选方式,比如本篇的这两种,学习了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/294959.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android之自定义 ActionBar 上的菜单(Menu)文字颜色

本文记录了修改 ActionBar 上 Menu 字体颜色的方法。第一种通过自定义主题实现&#xff0c;第二种通过复写onCreateOptionsMenu实现。 自定义Theme 修改MenuItem 文字颜色 自定义 ActionBar 上的菜单文字颜色需要通过 Activity 的 Theme 实现&#xff0c;而非 ActionBar 的 The…

删除远程桌面登陆痕迹

怎么删除本地远程桌面地址记录(连接地址输入框的下拉菜单)。 首先运行regedit&#xff0c;打开注册表&#xff0c;找到 HKEY_CURRENT_USER&#xff3c;Software&#xff3c;Microsoft&#xff3c;Terminal Server Client&#xff3c;Default 右边的那些键值就记录了IP或者域名&…

Java Web开发Tomcat中三种部署项目的方法

第一种方法&#xff1a;在tomcat中的conf目录中&#xff0c;在server.xml中的&#xff0c;<host/>节点中添加&#xff1a; <Context path"/hello" docBase"D:\eclipse3.2.2forwebtools\workspace\hello\WebRoot" debug"0" privileged&q…

Android 页面布局xd,Adobe XD强大的布局系列工具 助你事半功倍

数字设计有多种形式-从移动端、桌面网站到显示屏应用程序、智能助手、车载娱乐系统(例如CarPlay和Android Auto)等等。为当今的应用程序打造数字体验意味着需要针对各种屏幕尺寸、布局和交互类型进行设计。作为设计师&#xff0c;您的时间应该花在用户体验上&#xff0c;而不是…

JS中数组Array的用法{转载}

js数组元素的添加和删除一直比较迷惑&#xff0c;今天终于找到详细说明的资料了&#xff0c;先给个我测试的代码^-^var arr new Array();arr[0] "aaa";arr[1] "bbb";arr[2] "ccc";//alert(arr.length);//3arr.pop();//alert(arr.length);//2…

如果觉得午休时间太短怎么办?

1 假装自己戴了口罩&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼2 正义不会迟到博主是男的&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼3 阅读理解有多难&#xff1f;&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼4 下雨天就不要爬树了&…

Android之ActionBar常用设计和使用总结

常用ActionBar总结 我们经常看见项目的顶部有一些文字显示在中间,或者左边、右边,而且还有一个返回的图标,很方便我们返回,接下来我总结下常用的ActionBar 第一步:写常见的ActionBar的布局文件 我这里写了3个actionbar文件 1、actionbar_return.xml …

WPF 实现温度计

WPF开发者QQ群&#xff1a; 340500857 | 微信群 -> 进入公众号主页 加入组织在WPF中没有现成的温度计控件&#xff0c;所以我们自己实现一个。微信群人数太多入群请添加小编微信号&#xff08;yanjinhuawechat&#xff09;或&#xff08;W_Feng_aiQ&#xff09;邀请入群&am…

100-6

2019独角兽企业重金招聘Python工程师标准>>> /**\第6题&#xff08;数组&#xff09;腾讯面试题&#xff1a; 给你10分钟时间&#xff0c;根据上排给出十个数&#xff0c;在其下排填出对应的十个数 要求下排每个数都是先前上排那十个数在下排出现的次数。 上排的十个…

linux系统644、755、777权限详解

在linux系统中644、755、777三种权限是非常重要的一些权限了&#xff0c;下面我来详细的介绍644、755、777三种权限的使用&#xff0c;希望对各位有帮助。常用的linux文件权限&#xff1a; 444 r--r--r-- 600 rw------- 644 rw-r--r-- 666 rw-rw-rw- 700 rwx------ 744 rwxr--r…

android获取自适应高度,Android中oncreate中获得控件高度或宽度的实现方法

Android中oncreate中获得控件高度或宽度的实现方法onCreate函数只是提供了数据初始化的机会&#xff0c;此时还没有正式绘制图形。在图形尚未渲染的情况下&#xff0c;getWidth()或getHeight()得到的值为0。如果需要自适应屏幕&#xff0c;需要一进入界面就得到父控件大小&…

单例模式7种实现

单例模式 1 、介绍&#xff1a; 单例模式(Singleton)也叫单态模式&#xff0c;是设计模式中最为简单的一种模式&#xff0c;甚至有些模式大师都不称其为模式&#xff0c;称其为一种实现技巧&#xff0c;因为设计模式讲究对象之间的关系的抽象&#xff0c;而单例模式只有自己一…

博导眼里本科生的科研能力:“他们还在玩泥巴”

父母眼中的科学博士&#xff1a;造飞机&#xff0c;造航母&#xff0c;造火箭本科生眼中的科学博士&#xff1a;特严谨&#xff0c;特专业&#xff0c;特……特别老硕士研究生眼中的博士&#xff1a;真能熬&#xff0c;真能写&#xff0c;真坚定博导眼中的博士&#xff1a;还年…

最全前端开发面试问题及答案整理

来自Github秋风的原文 说说你对闭包的理解 Talk about your understanding of closures 使用闭包主要是为了设计私有的方法和变量。闭包的优点是可以避免全局变量的污染&#xff0c;缺点是闭包会常驻内存&#xff0c;会增大内存使用量&#xff0c;使用不当很容易造成内存泄露。…

C# 10 新特性 —— 补充篇

C# 10 新特性 —— 补充篇Intro前面已经写了几篇文章介绍 C# 10 新特性的文章&#xff0c;还有一些小的更新Constant interpolated strings在之前的版本中&#xff0c;如果想要使用插值字符串来&#xff0c;则不能声明为一个常量如果依赖于一个常量的插值字符串就只能声明为一个…

线性表的基本操作

#include <stdio.h>#include <stdlib.h>#define OK 1#define ERROR 0//#define INITSIZE 5 //线性表存储空间的初始分配量//#define LISTINCREMENT 1 //线性表存储空间分配增量//实现线性表的顺序存储结构的类型定义typedef int DataType;//线性表的数据类型&#…

android技术积累,Android开发中积累的一些报错的解决方法

1.报错&#xff1a;The connection to adb is down, and a severe error has occured.[2012-03-11 09:36:56 - Camera] You must restart adb and Eclipse.[2012-03-11 09:36:56 - Camera] Please ensure that adb is correctly located at D:\SDK_1.5\platform-tools\adb.exe …

达内TTS6.0课件oop_day01

转载于:https://www.cnblogs.com/suncoolcat/p/3329114.html

过年前谈个恋爱很过分吗?

1 小盆友的广东口音有多好玩&#xff1f;&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼2 今年你进步了吗&#xff1f;&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼3 收到课本的丁真&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼4 上海业主…

office professional 2010 key

1、Office Professional Plus 2010&#xff1a;&#xff08;VL&#xff09; MKCGC-FBXRX-BMJX6-F3Q8C-2QC6P转载于:https://blog.51cto.com/wanghao/1028409