准备开始准备使用带有并发的map功能首先要导入相关包文件: from multiprocessing import Poolfrom multiprocessing.dummy import Pool as ThreadPool 然后初始化: pool = ThreadPool() 就这么简单一句解决了example2.py中build_worker_pool的功能. 具体来讲,它首先创建一些有效的worker启动它并将其保存在一些变量中以便随时访问。 pool对象需要一些参数,但现在最紧要的就是:进程。它可以限定线程池中worker的数量。如果不填,它将采用系统的内核数作为初值. 一般情况下,如果你进行的是计算密集型多进程任务,内核越多意味着速度越快(当然这是有前提的)。但如果是涉及到网络计算方面,影响的因素就千差万别。所以最好还是能给出合适的线程池大小数。 pool = ThreadPool(4) # Sets the pool size to 4 如果运行的线程很多,频繁的切换线程会十分影响工作效率。所以最好还是能通过调试找出任务调度的时间平衡点。 好的,既然已经建好了线程池对象还有那些简单的并发内容。咱们就来重写一些example2.py中的url opener吧! 看吧!只用4行代码就搞定了!其中三行还是固定写法。使用map方法简单的搞定了之前需要40行代码做的事!为了增加趣味性,我分别统计了不同线程池大小的运行时间。 结果:效果惊人!看来调试一下确实很有用。当线程池大小超过9以后,在我本机上的运行效果已相差无几。 示例 2:生成上千张图像的缩略图: 现在咱们看一年计算密集型的任务!我最常遇到的这类问题之一就是大量图像文件夹的处理。 其中一项任务就是创建缩略图。这也是并发中比较成熟的一项功能了。 基础单线程创建过程 作为示例来说稍微有点复杂。但其实就是传一个文件夹目录进来,获取到里面所有的图片,分别创建好缩略图然后保存到各自的目录当中。 在我的电脑上,处理大约6000张图片大约耗时27.9秒. 如果使用并发map处理替代其中的for循环: 只用了5.6 秒! 就改了几行代码速度却能得到如此巨大的提升。最终版本的处理速度还要更快。因为我们将计算密集型与IO密集型任务分派到各自独立的线程和进程当中,这也许会容易造成死锁,但相对于map强劲的功能,通过简单的调试我们最终总能设计出优美、高可靠性的程序。就现在而言,也别无它法。 好了。来感受一下一行代码的并发程序吧。 本文地址:http://www.oschina.net/translate/python-parallelism-in-one-line 英文原文:Parallelism in one line参与翻译(1人): |