本文实例讲述了Python多进程池 multiprocessing Pool用法。分享给大家供大家参考,具体如下:
1. 背景
由于需要写python程序, 定时、大量发送htttp请求,并对结果进行处理。
参考其他代码有进程池,记录一下。
2. 多进程 vs 多线程
- c++程序中,单个模块通常是单进程,会启动几十、上百个线程,充分发挥机器性能。(目前c++11有了std::thread编程多线程很方便,可以参考我之前的博客)
- shell脚本中,都是多进程后台执行。({ ...} &, 可以参考我之前的博客,实现shell并发处理任务)
- python脚本有多线程和多进程。由于python全局解锁锁的GIL的存在,一般建议 CPU密集型应该采用多进程充分发挥多核优势,I/O密集型可以采用多线程。
尽管Python完全支持多线程编程, 但是解释器的C语言实现部分在完全并行执行时并不是线程安全的。
实际上,解释器被一个全局解释器锁保护着,它确保任何时候都只有一个Python线程执行。
GIL最大的问题就是Python的多线程程序并不能利用多核CPU的优势 (比如一个使用了多个线程的计算密集型程序只会在一个单CPU上面运行)。
3. multiprocessing pool使用例子
对Pool对象调用join()
方法会等待所有子进程执行完毕,调用join()
之前必须先调用close()
,让其不再接受新的Process了
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
#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程序设计有所帮助。
原文链接:https://www.cnblogs.com/xudong-bupt/p/9369605.html