multiprocessing模块可以让程序并行化,加快运行速度。
并行化的概念可以比喻成若干个人去银行办理业务,只有一个银行窗口可以办理,所以大家只能排队等待。并行化任务后,好似开放了多个银行窗口,这样大家就可以分别处理各自的事情,
最终大家都很快的办理完了自己的业务,完成了全部的任务。
并行化有两种方式:共享内存式和分布式内存。共享内存,各个任务都公用一块内存数据,会产生矛盾问题(比如说我要往a账户处存1,你要同时从a处取200,到底怎么处理,这样产生矛盾,就涉及到谁先谁后,以及如何加锁数据等问题);分布式内存各自开辟自己的内存区域(各有各的账户),互不影响。
multiprocessing模块内部有套自己的解决锁问题的方案。multiprocessing的Pool类提供了并行化的简便方法。管理进程池机制。
python3内置了multiprocessing模块。
示例代码:
import multiprocessing def get_result(num): process_name = multiprocessing.current_process().name # 当前进程名称 print("当前进程:", process_name, ",输入数字:", num) return 10 * num if __name__ == '__main__': numbers = [2, 4, 6, 8] # pool = multiprocessing.Pool(2) # 创建两个进程池 mylist = pool.map(func=get_result, iterable=numbers) # 将get_result函数应用到每个numbers的元素上 pool.close() # close()函数在工作进程执行后停止它 pool.join() # 阻塞直到工作进程终止 print("输出:", mylist) # 完毕后输出总结果
结果如下:
当前进程: SpawnPoolWorker-1 ,输入数字: 2
当前进程: SpawnPoolWorker-1 ,输入数字: 4
当前进程: SpawnPoolWorker-1 ,输入数字: 6
当前进程: SpawnPoolWorker-2 ,输入数字: 8
输出: [20, 40, 60, 80]
Process finished with exit code 0
将numbers列表的每个元素乘10,并返回最终结果。
使用了进程池1三次,进程池2一次。需要注意的是每次结果不一样,不一定调用哪个进程池。