背景
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)代码执行结果

python多进程性能 python多进程multiprocessing_python

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)代码执行结果:

python多进程性能 python多进程multiprocessing_进程池_02