Python multiprocessing Pool多进程池使用详解与示例
本文详解Python中multiprocessing.Pool的使用。针对CPU密集型任务,多进程可突破GIL限制利用多核优势。通过示例展示Pool的创建、map方法调用及close与join的正确顺序,实现高效并行处理。
本文详细介绍Python中multiprocessing模块下Pool类的具体用法,旨在为读者提供清晰的参考与实操指导。
1. 背景
开发需求涉及编写Python程序,以定时、批量方式发送HTTP请求,并对返回结果进行后续处理。
鉴于其他代码中使用了进程池技术,此处对此方法进行记录与分享。
2. 多进程 vs 多线程
- 在C++程序中,单个模块通常采用单进程架构,但会启动数十甚至上百个线程,以充分利用机器性能。(注:C++11已支持std::thread进行多线程编程,便捷性较高,可参考相关博客文章)。
- 在Shell脚本中,通常采用多进程后台执行的方式。(参考相关博客,了解如何实现Shell并发任务处理)。
- Python脚本同时支持多线程和多进程。由于Python存在全局解释器锁(GIL),一般建议:CPU密集型任务应采用多进程,以充分发挥多核CPU的优势;而I/O密集型任务则可采用多线程。
尽管Python完全支持多线程编程,但其C语言实现的解释器在完全并行执行时并非线程安全。实际上,解释器受全局解释器锁(GIL)保护,确保同一时刻仅有一个Python线程执行。GIL的主要局限在于,Python的多线程程序无法有效利用多核CPU的优势(例如,一个包含多个线程的计算密集型程序仍会在单个CPU核心上运行)。
3. multiprocessing pool使用例子
对Pool对象调用join()方法将阻塞并等待所有子进程执行完毕。在调用join()之前,必须先调用close(),以停止接收新的Process任务。
#coding=utf-8
import logging
import time
from multiprocessing import Pool
logging.basicConfig(level=logging.INFO, filename='logger.log')
class Point:
def __init__(self, x = 0, y= 0):
self.x = x
self.y = y
def __str__(self):
return "(%d, %d)" % (self.x, self.y)
def fun1(point):
point.x = point.x + 3
point.y = point.y + 3
time.sleep(1)
return point
def fun2(x):
time.sleep(1)
logging.info(time.ctime() + ", fun2 input x:" + str(x))
return x * x
if __name__ == '__main__':
pool = Pool(4)
#test1
mylist = [x for x in range(10)]
ret = pool.map(fun2, mylist)
print ret
#test2
mydata = [Point(x, y) for x in range(3) for y in range(2)]
res = pool.map(fun1, mydata)
for i in res:
print str(i)
#end
pool.close()
pool.join()
print "end"
运行结果如下:
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81] (3, 3) (3, 4) (4, 3) (4, 4) (5, 3) (5, 4) end
4. 参考
Python 多进程 multiprocessing.Pool类详解 Python 多线程和多进程编程总结 Python的全局锁问题
更多关于Python相关内容感兴趣的读者可查看本站专题:《Python进程与线程操作技巧总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》、《Python+MySQL数据库程序设计入门教程》及《Python常见数据库操作技巧汇总》
希望本文所述对大家Python程序设计有所帮助。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













