前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Parallel并行化编程

Parallel并行化编程

作者头像
魏守峰
发布2018-04-28 16:18:11
9230
发布2018-04-28 16:18:11
举报
文章被收录于专栏:点滴积累点滴积累

在很多场景中我们需要通过并行化的方式来提高程序运行的速度,比较典型的需求就是并行下载。前期遇到一个需求是要批量下载瓦片,每次大概下载上百万个瓦片,要想提高瓦片的下载速度,只能通过并行化的方式,下面把我解决此问题的思路和代码总结如下:

第一步确定线程个数(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进行并行化编程的方式,看似简单的代码,其实蕴藏了一个哲学问题(所有问题上升到一定程度都是哲学问题)——做事要细分:将一件复杂的事情尽量根据实际情况进行细分,完成一件一件小的任务,整个任务也就完成了。

另最近事情比较多,思绪有些混乱,忘见谅!

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016-05-29 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档