首页 > 其他分享 >限制异步HTTP请求并发:简单、有效的20个并发下载控制策略

限制异步HTTP请求并发:简单、有效的20个并发下载控制策略

时间:2024-04-11 16:24:16浏览次数:25  
标签:异步 HTTP url System 20 并发 using

 

概述:通过使用`SemaphoreSlim`,可以简单而有效地限制异步HTTP请求的并发量,确保在任何给定时间内不超过20个网页同时下载。`ParallelOptions`不适用于异步操作,但可考虑使用`Parallel.ForEach`,尽管在异步场景中谨慎使用。

对于并发异步 I/O 操作的数量限制,可以使用SemaphoreSlim,但由于AsParallel 使用的是 PLINQ(Parallel LINQ),而 PLINQ 不太适用于异步操作。因此,我们可以使用异步的 Task.WhenAll 和 SemaphoreSlim 来实现并发控制。同时,ParallelOptions 不适用于异步操作,因为它主要用于同步的 Parallel 类库。

以下是一个使用 SemaphoreSlim 的示例,以确保在任何给定时间下载的网页不超过 20 个:

using System;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        string[] urls = { "http://google.com", "http://yahoo.com", /*...*/ };

        // 设置最大并发数为20
        int maxConcurrency = 20;
        var semaphore = new SemaphoreSlim(maxConcurrency);

        var tasks = urls.Select(url => DownloadUrlAsync(url, semaphore));

        await Task.WhenAll(tasks);
    }

    static async Task DownloadUrlAsync(string url, SemaphoreSlim semaphore)
    {
        await semaphore.WaitAsync();

        try
        {
            var client = new HttpClient();
            var html = await client.GetStringAsync(url);
            // 处理获取的 HTML 数据
            Console.WriteLine($"Downloaded {url} successfully");
        }
        catch (Exception ex)
        {
            // 处理异常
            Console.WriteLine($"Error downloading {url}: {ex.Message}");
        }
        finally
        {
            semaphore.Release();
        }
    }
}

在这个例子中,SemaphoreSlim 用于限制并发异步 I/O 操作的数量。WaitAsync 方法用于获取信号,Release 方法用于释放信号。这确保了在任何给定时间内,同时运行的异步操作数量不会超过 maxConcurrency 指定的最大并发数。

如果你想使用 ParallelOptions,你可以考虑使用 Parallel.ForEach,但要注意这仍然适用于同步操作。以下是一个示例:

using System;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        string[] urls = { "http://google.com", "http://yahoo.com", /*...*/ };

        // 设置最大并发数为20
        int maxConcurrency = 20;

        Parallel.ForEach(urls, new ParallelOptions { MaxDegreeOfParallelism = maxConcurrency }, async (url) =>
        {
            var client = new HttpClient();
            var html = await client.GetStringAsync(url);
            // 处理获取的 HTML 数据
            Console.WriteLine($"Downloaded {url} successfully");
        });
    }
}

上述代码使用的 Parallel.ForEach 并不能直接处理异步委托,因此需要谨慎使用。在异步场景中,使用 SemaphoreSlim 进行手动并发控制可能是更可靠的选择。

 

标签:异步,HTTP,url,System,20,并发,using
From: https://www.cnblogs.com/hanbing81868164/p/18127911

相关文章

  • CJ20N 增强客户字段 引用别人公众号文章
    引用:PSCJ20N项目定义属性字段增强(qq.com)达成效果: 一、CJ20N添加字段 二、用户出口CNEX0006 CMOD分配CNEX0006出口EXIT_SAPLCJWB_002找到全局文件ZXCN1TOP,引入PROJ,定义判断是否可编辑的变量G_DISPLAY 实现包含文件ZXCNU11数据展示到子屏幕获取标准屏幕是否......
  • 2024-04-11 15:45
    今天终于是写上日记了,之前要么没时间要么就不想写,过完年后有一大片空白期,领导看我们很清闲,就给我们各自安排学习任务,我学习Flutter相关知识,但是学习了之后发现Flutter是个框架,里边的语言是dart语言,发现还的学习dart,还要整理学习文档,哦我的天之前的东西都没明白就又学习另外一种语......
  • 转载 ebpf sockmap/redirection 提升 socket 性能(2020)
    利用ebpfsockmap/redirection提升socket性能(2020)转自:https://arthurchiao.art/blog/socket-acceleration-with-ebpf-zh/译者序本文翻译自2020年的一篇英文博客 HowtouseeBPFforacceleratingCloudNativeapplications。原文标题非常宽泛,但内容其实很技术:展示了......
  • 2024.04.11NOIP模拟赛 #1 记录
    2024.04.11NOIP模拟赛#1记录AT_arc160_e[ARC160E]MakeBiconnected给你一棵\(n\)个节点由无向边组成的二叉树,树上每个点有权值\(w_i\)。你可以把两个点之间连无向边,如果将\(u\)与\(v\)连边,代价是\(w_u+w_v\)。请给出一种连边方式,使得连边后,图中去掉任何一个点仍然......
  • stm32采集烟雾和温湿度+ESP8266转发解析+python构造http
      https://www.cnblogs.com/gooutlook/p/16061136.html  http://192.168.1.103/Control_SensorPin?sensor=sensor_all&action=GetDatapython#-*-coding:utf-8-*-importrequestsimporturllib.parse#pipinstallrequestsdefSendHttp():#ht......
  • SpingBoot项目Tomcat假死,导致http(openfeign)请求无法响应问题定位
    项目简介:<spring-boot.version>2.3.2.RELEASE</spring-boot.version><spring-cloud.version>Hoxton.SR12</spring-cloud.version>使用docker进行项目部署问题描述:项目中代码中大量使用异步多线程操作,没个异步过程中大量掺杂数据库查询、Redis查询、Feign调用、RabbitMq发送接收......
  • 20240409
    T1TopcoderSRM593div2Hard-MayTheBestPetWin由于每个宠物都要被分到一组中,所以只需要知道一组中的\(\summx-\summn\)就可以推出另一组的\(\summx-\summn\)。然后直接背包dp即可。代码#include<iostream>usingnamespacestd;constintN=500000;i......
  • 洛谷题单指南-数学基础问题-P1029 [NOIP2001 普及组] 最大公约数和最小公倍数问题
    原题链接:https://www.luogu.com.cn/problem/P1029题意解读:已知x,y,求有多少对p、q,使得p、q的最大公约数为x,最小公倍数为y。解题思路:枚举法即可。枚举的对象:枚举p,且p必须是x的倍数,还有p<=yq的计算:q=x*y/p,q要存在,必须x*y%p==0,且gcd(p,q)==x100分代码:#include......
  • 中电金信:行业智观|2023银行年报分析——金融科技发展新格局(上篇)
    ​​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑​......
  • 如何设计一个高并发系统?
    一、为什么要做高并发首先你得知道你当前的项目为什么要做高并发,之前的单体架构为什么不满足你的需求?当前的系统架构已经远远不能满足你的业务需求?当前的系统的并发数已经越来越多,加机器代理已经无法解决此问题?当前系统用户数越来越多,数据量越来越大,数据库极可能在崩的边缘?......