Parallel并行化编程
在很多场景中我们需要通过并行化的方式来提高程序运行的速度,比较典型的需求就是并行下载。前期遇到一个需求是要批量下载瓦片,每次大概下载上百万个瓦片,要想提高瓦片的下载速度,只能通过并行化的方式,下面把我解决此问题的思路和代码总结如下:
第一步确定线程个数(ThreadCount),这个要根据网络情况和硬件配置进行确定,可以做成一个配置项由用户自行确定。
第二步将任务分成ThreadCount个,此步需要注意处理任务数较少(小于线程个数)以及任务数除不尽ThreadCount的情况。处理方式为任务数较少时不进行任务细分,由一个线程处理;除不尽的情况解决方案是最后一个任务处理剩下所有的任务。具体代码如下:
1 var list_thread = new List<List<Location>>();//细分的下载任务(均分) 2 3 if (list.Count >= 1000)//如果比1000个还小不细分,一个线程执行 4 { 5 var count = (int)(list.Count / threadCount); 6 for (int i = 0; i < threadCount; i++) 7 { 8 if (i == threadCount - 1) 9 list_thread.Add(list.Skip(i * count).Take(list.Count - count * (threadCount - 1)).ToList());//最后一个取剩下的所有 10 else 11 list_thread.Add(list.Skip(i * count).Take(count).ToList()); 12 } 13 } 14 else 15 list_thread.Add(list);
其中list_thread是细分后的任务列表,list是原始任务。
第三步处理所有任务,并添加到线程列表,等待所有线程执行完毕,即为所有任务处理完毕,具体代码如下:
1 var list = ...;//获取所有任务 2 var list_thread = GetThreadCountList(loc_list);//获取细分的线程任务 3 4 var listTask = new List<Task>();//存储所有线程任务 5 foreach (var item in list_thread)//几个细分任务就创建几个线程 6 { 7 listTask.Add(Task.Factory.StartNew(() => DoWork(item)));//处理单个线程 8 } 9 Task.WaitAll(listTask.ToArray());//等待所有线程处理完毕!
以上就是使用Parallel进行并行化编程的方式,看似简单的代码,其实蕴藏了一个哲学问题(所有问题上升到一定程度都是哲学问题)——做事要细分:将一件复杂的事情尽量根据实际情况进行细分,完成一件一件小的任务,整个任务也就完成了。
另最近事情比较多,思绪有些混乱,忘见谅!
分类:
C#
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端