课程咨询 :13623629309

太原PHP培训 > 达内新闻 > 太原php培训机构:一分钟让你的程序支持队列和并发(2)
  • 太原php培训机构:一分钟让你的程序支持队列和并发(2)

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

  • 首先本文的原理可见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高级开发名企定制班(剩2个名额)

php高级开发名企定制班(剩2个名额)

开班日期:12-30

php高级开发周末班(剩5个名额)

php高级开发周末班(剩5个名额)

开班日期:12-30

php高级开发免费试听(剩5个名额)

php高级开发免费试听(剩5个名额)

开班日期:12-30

更多高级开发工程师精品班

更多高级开发工程师精品班

开班日期:12-30

  • 地址:山西省太原市小店区学府街长治路高新国际A座24层
  • 课程培训电话:13623629309     全国服务监督电话:400-827-0010
  • 服务邮箱 ts@tedu.cn
  • 2001-2016 达内国际公司(TARENA INTERNATIONAL,INC.) 版权所有 京ICP证08000853号-56

    在线客服系统