首页 > 其他分享 >并行执行异步方法的最佳实践

并行执行异步方法的最佳实践

时间:2023-02-13 16:59:08浏览次数:50  
标签:异步 sum Parallel 最佳 async 并行执行 代码

前言

最近写了三篇关于并行异步的博客,因为我走了很多弯路。

并行执行异步方法并接收返回值这个问题,stackoverflow上讨论好几年,.NET 6实现了Parallel.ForeachAsync。https://stackoverflow.com/questions/15136542/parallel-foreach-with-asynchronous-lambda

.NET 6 中的 API Parallel.ForEachAsync 在官方的博客中一直被忽略,但是我觉得这个 API 非常的实用!(这句话参考了博客:https://blog.csdn.net/sD7O95O/article/details/117914853)

要求

  1. 必须接收处理返回值

示例1

示例2

代码说明

  1. 这种代码,java是无法优雅地写出来的,会很难阅读和维护。java19也许可以。
  2. 使用场景:普通的增删改查功能估计是用不到,但我用到了。
  3. 上述代码的并行度,可以根据es集群的性能和吞吐量以及具体需求,进行合理的调整。

可以复制的代码

上述代码是图片不方便复制,可以复制的代码在 探索:优雅地实现异步方法的并行执行 文章的最后。

简单的示例Demo代码

private async void button4_Click(object sender, EventArgs e)
{
    await Task.Run(async () =>
    {
        Log($"==== 并行异步 开始,线程ID={Thread.CurrentThread.ManagedThreadId} ========================");
        Stopwatch sw = Stopwatch.StartNew();
        HttpClient httpClient = HttpClientFactory.GetClient();
        var tasks = new Dictionary<string, Task<Dictionary<int, int>>>();
        ConcurrentQueue<string> strs = new ConcurrentQueue<string>();

        await Parallel.ForEachAsync(Enumerable.Range(0, m), new ParallelOptions() { MaxDegreeOfParallelism = 100 }, async (i, c) =>
        {
            int sum = 0;
            await Parallel.ForEachAsync(Enumerable.Range(0, n), new ParallelOptions() { MaxDegreeOfParallelism = 30 }, async (j, c) =>
            {
                Dictionary<int, int> dict = await RequestAsync(_url, i);
                if (dict.ContainsKey(j))
                {
                    int num = dict[j];
                    Interlocked.Exchange(ref sum, sum + num);
                    strs.Enqueue($"{num}");
                }
            });
            Log($"输出:sum={sum}");
        });

        Log($"输出:{string.Join(",", strs.ToArray())}");
        sw.Stop();
        Log($"==== 结束,线程ID={Thread.CurrentThread.ManagedThreadId},耗时:{sw.Elapsed.TotalSeconds:0.000}秒 ========================");
    });
}

上述代码说明

代码中 Parallel.ForEachAsync(Enumerable.Range(0, m),... 代替了for循环。

标签:异步,sum,Parallel,最佳,async,并行执行,代码
From: https://www.cnblogs.com/s0611163/p/17116735.html

相关文章

  • JavaScript的原型、原型链、异步与单线程复习回顾
     原型和原型链有对象的地方就有原型,每个对象都会在其内部初始化一个属性,就是prototype(原型),原型中存储共享的属性和方法。当我们访问一个对象的属性时,js引擎会先看当......
  • 异步提交表单以及代码实现
    异步提交表单在此使用异步提交表单是为了获取服务器响应的数据,因为我们前台使用的是html作为视图层,不能够直接从servlet相关的域对象获取值,只能通过ajax获取响应数据regi......
  • X-tile 寻找生存分析最佳截断值
    有的时候我们会发现,单因素cox回归某个基因对生存有意义,当以中位值绘制生存曲线的时候,却变得没意义了。这是因为中位值并不是这个基因最合适的截断值,因此,我们需要选择最合......
  • 刷刷刷 Day 32 | 122. 买卖股票的最佳时机 II
    122.买卖股票的最佳时机IILeetCode题目要求给你一个整数数组prices,其中 prices[i]表示某支股票第i天的价格。在每一天,你可以决定是否购买和/或出售股票。你在任......
  • NIO,同步异步,阻塞非阻塞
    1、我们何时使用IO,何时使用NIO呢?这两者有三个差异:1)IO面向流,NIO是面向缓冲区的,IO面向流意味着每次从流中读一个或多个字节,直到读取所有字节,它们没有被缓存在任何地方。此......
  • 事件监听器 - 实现异步监听
    异步监听代码实现:publicclassAsyncApplicationEventMulticasterextendsAbstractApplicationEventMulticaster{privateTaskExecutortaskExecutor=newSim......
  • 手把手教你Parallels Desktop最佳化设置,让Windows更加好用!
    原文来源于黑果魏叔官网,转载需注明出处。图文教程:1、我们右键Dock栏的ParallelsDesktop图标(简称PD图标),选择偏好设置  2、点通用选项卡,把在菜单栏中显示Parallels图标的勾......
  • 前端-vue基础91-async/await处理多个异步请求
     ......
  • c#异步编程
    滴答的雨的异步编程系列文章hystar的异步编程系列文章小弟的异步编程系列文章 ......
  • 买卖股票的最佳时机(力扣简单题)
    题目:给定一个数组prices,它的第i个元素prices[i]表示一支给定股票第i天的价格。你只能选择某一天买入这只股票,并选择在未来的某一个不同的日子卖出该股票。设......