集合操作最简单的高效并行处理
并行处理是现代开发中必不可少的部分,凡是资源可以相互独立的,都可以运用并行,这样可以充分利用多核CPU的性能,当然,我们也要注意,一定要无阻塞,写出让线程阻塞的代码是每个开发人员的耻辱
还是通过实际场景来说明吧,有个项目,每天晚上要对所有用户进行等级评定,用户信息存储在数据库的User表上,那么怎么在单进程中能够最高效的处理呢?读出用户信息,一个个的串行执行,自然是最差的方式,
一次读出几十条,设置一个最大并行度,按照这个并行度去并行为每个用户执行评定,等这几十条处理完成,再去读取下一批数据,再接着这样处理,这样的方式,可行,但并不是最优,因为等级计算要花费的时间并不固定,可能这一批中某个用户计算的时间很长,其余用户计算的很快,那么,这一批完成最终需要的时间是那个最长的时间,这样累计下来,还是浪费了不少时间
所以,我现在说的方案才是最高效的方式,设置一个最大并行度,按最大并行度设置任务列表,列表中的每个任务不断从数据源中取数据,能取到,就处理,直到取不到为止,最后,等待任务列表中的任务完成,这样的话,就完全避开了上面那个方案的缺点了,也不会有线程阻塞,能够最高效的处理数据
现在,通过两个类,不多的代码,就可以写出高效的并行处理,话不多说,看代码
ParallelHelper:并行帮助器,ForEach方法,为并行处理方法,传入并行度、数据源、以及要进行的处理动作,
AsyncInteration:异步迭代器,盼星星盼月亮,终于盼到微软出了IAsyncEnumerator,这样我们就能设计出无阻塞数据源了,具体代码自己看吧,我觉得我设计的这个类还是比较精妙的(自吹一把)
对于上面的场景,我们可以新建一个AsyncInteration,传入getDataFun动作,在这动作里面,分批查询用户,然后将该AsyncInteration对象作为数据源传入ForEach方法,就完全实现了高效并行处理了
代码已经上传github,还是在老地方,可以直接运行