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一次。需要注意的是每次结果不一样,不一定调用哪个进程池。