太原PHP培训
达内太原php培训中心

0351-5608878

热门课程

太原php培训机构:一分钟让你的程序支持队列和并发(2)

  • 时间:2016-09-22
  • 发布:太原PHP培训
  • 来源:伯乐在线

首先本文的原理可见PYMOTW的Implementing MapReduce with multiprocessing,也就是利用multiprocessing.Pool(进程池)的map方法实现纯Python的MapReduce。由于篇幅我把英语注释去掉:

为了帮助新手理解,我解释下其中几个点:

1. processes:源文章叫做num_worker,现在标准库这个参数已经叫做processes了,如果是None,会赋值成CPU的数量。 启动的进程数量要考虑资源竞争,对数据库的访问压力等多方面内容,有时候多了反而变慢了。

2. chunksize:是每次取任务的数量,任务小的话可以一次批量的多取点。这个是经验值。

3. chain表示把可迭代的对象串连起来组成一个新的大的迭代器。

这个SimpleMapReduce需要传递一个map函数和一个reduce函数,事实上就是执行2次self.pool.map,使用者可以忽略队列的细节(但是严重推荐看一下源码的实现),第二次直接返回结果而已。当然这个例子中reduce函数可以不设置,也就是不关心结果。

那怎么用呢?首先你要明确可拆分的单元,比如解析某些目录下的文件内容,那么每个被解析的文件就可以作为一个子任务;想获得10w用户的某些数据,那么每个用户就是一个子任务。注意单元也可以按照业务特点更集中,比如10w用户我们可以按某种规则分组,100人为一个组,也就是一个单元。

最后我们验证下这种方式是不是最好,首先这里有一个应用日志的目录,目录下有多个日志文件:

需求很简单,遍历目录下的文件,找到符合条件的日志条目数量。代码放在Gist上面就不贴出来了。

我们挨个看看运行效果:

1. simple.py。单进程方式,结果如下:

COST: 249.42918396

也就是花了249秒!!那设想下,现在有T级别的日志,更复杂的处理,你得等多久?

2. multiprocessing_queue.py。多进程 + 队列的方式,把每个文件作为任务放入队列,启动X个进程去获取任务,最后放X个None到队列中,如果获取的任务是None,表示任务都执行完了,进程就结束。任务的执行结果放另外一个队列,最后获取全部的执行结果,这次没有放None,而是捕捉get方法超时来判断队列中有没有待执行的任务。同时,也测试了单倍和双倍CPU个数(测试使用的服务器为24核)的进程的执行效果的对比:

CPU个数:COST: 30.0309579372

CPU个数 * 2:COST: 32.4717597961

2个结论:

1. 速度比单进程只提高了8倍,其中一个原因是这个服务器并不是闲置的,还在完成其他任务。

2. 可见进程更多并没有提高运行效率,这个需要在实际工作中注意。

3. multiprocessing_pool.py,使用上述的SimpleMapReduce的方式,但是有一点需要注意,SimpleMapReduce的map函数的返回值的每一项都是键、符合数的元组(或列表),而之前的解析函数返回的就是符合的结果,所以我们得简单封装一下下:

执行的结果如下:

COST: 26.9822928905

看到了吧,你只是额外写了一个map_wrapper,就实现了multiprocessing_queue.py里面那一堆代码的功能。

达内时代科技集团致力于培养面向电信和金融领域JavaC++C#/.Net3G/Android3G/IOSPHP、嵌入式、软件测试、UID、网络营销、网络工程、会计、UEDwebUnity3D、大数据、童程童美等17大方向中高端软件人才课程与少儿教育课程。选择太原php培训班,不再孤军奋战,轻轻松松做IT高薪白领。太原达内培训带领有明确目标的学子迈向成功之路!想找工作的求职者可以加QQ3373924515(太原达内就业服务部)咨询了解。

上一篇:太原php培训:一分钟让你的程序支持队列和并发
下一篇:太原php培训:微信步步为营,百度层层溃败

太原php培训资源站

太原PHP编程开发并发编程槽与坑

Php开发规划自己的路

太原php培训老生常谈php

选择城市和中心
贵州省

广西省

海南省

台湾