背景:
multiprocessing库用于进行python的多进程编程。一般来说,编程语言要进行并发编程,多线程会比多进程优先考虑,因为多线程比多进程更省资源。但是由于python底层的GIL的存在,导致了多线程编程时,实际上每个时刻只有一个线程在运行,也即只有一个核被利用起来,并没有起到并行的效果(此说法针对的是cpu密集型的代码,如果是I/O密集型的,多线程还是会有效果的)。于是为了真正利用起来多核,python中需要使用多进程编程。
multiprocessing的进程池的使用:
1)基本操作流程:在主进程中实例化一个进程池pool对象---->往进程池中放入多个进程---->是否阻塞主进程---->结束
2)代码示例:
# coding = utf-8
import multiprocessing
import time
def sleepAndPrint():
time.sleep(5)
print("print after sleeping, process name: "+multiprocessing.current_process().name)
if __name__=="__main__":
pool = multiprocessing.Pool(4)
for item in range(4):
pool.apply(sleepAndPrint)#apply方法,每个进程之间是相互阻塞的,即实际上多个进程之间是串行的效果
pool.close()#close方法关闭进程池,此时不允许新的子进程进入。close方法必须在join方法调用前调用
pool.join()#主进程被阻塞,等子进程全部执行完毕后再执行print
print("test end")
3)代码执行结果
4)将apply方法替换成apply_async方法,并传入参数。代码示例:
# coding = utf-8
import multiprocessing
import time
def sleepAndPrint(seconds):
time.sleep(seconds)
print("print after sleeping, process name: "+multiprocessing.current_process().name)
if __name__=="__main__":
pool = multiprocessing.Pool(4)
for item in range(4):
pool.apply_async(sleepAndPrint, args=(5, ))#apply_async方法,通过args参数传参,进程之前不阻塞,真正意义上的并行
pool.close()#close方法关闭进程池,此时不允许新的子进程进入。close方法必须在join方法调用前调用
pool.join()#主进程被阻塞,等子进程全部执行完毕后再执行print
time.sleep(5)
print("test end")
5)代码执行结果: