Python多进程编程入门,基本使用,queue的使用,pool使用和共享变量的使用
完整代码点击这里
一、基本使用
Python有多进程(multiprocessing)与多线程(multithreading)两种并行的方式,在python中导入库
1 | import multiprocessing as mp |
我们编写一个代码来比较multiprocessing、multithreading和serial三种执行的效率
要使用并行,首先要先准备一个被调用的函数
1 | def job(q, a): |
多进程
1 | def multiprocess(): |
多线程
1 | def multithread(): |
串行执行
1 | def serial(): |
调用
1 | if __name__ == '__main__': |
输出
1 | serial: 24999833335833300000 |
可以看出,multiprocessing比普通串行的执行要快一些,但是multithreading比串行要慢一些。multithreading要体现性能的提升必须在任务有大量的IO时,在计算密集型的程序内,multithreading无法体现优越性。事实上,当处理的事情越少时,调度多进程的代价大于多进程带来的性能提升,两种并行都要比串行要慢
二、使用pool来调用python多进程
1 | import multiprocessing as mp |
输出
1 | [0, 1, 8, 27, 64, 125, 216, 343, 512, 729] |
三、共享变量与互斥锁
1 | import multiprocessing as mp |
输出(不使用互斥锁)
1 | -1 |
答案出现了错误,并且两个进程的执行顺序很随机,因为可能出现A进程读取变量到寄存器进行计算后时间片被用完挂起,B进程开始进行了读取之后挂起,当A将计算完的结果放回到内存挂起后B进程又将计算完的结果放回内存,A的计算就被覆盖,产生了错误。
输出(使用互斥锁)
1 | -1 |
可以看到进程1先抢到了互斥锁开始了自己的循环,直到执行完释放后进程2才开始执行。