multiprocessing模块可以多进程跑计算,其中有Pool是进程池,有Pipe可以通信等。
首先初始化一个进程池
p=Pool(4) # 4个进程
同步提交
同步提交的任务,会等待任务运行完成,再执行后面的程序
p.map(func_name,vars)
这个map跟普通map的计算结果一样,只不过使用进程池p来运行
这里相当于把vars中的每个值,都送入func_name进行计算,得到的结果与vars等长
p.apply(func_name,(args))
这里提交一个任务,就只能等它运行完,才会进行下一行命令,相当于func_name(args)
异步提交
异步提交了任务,会继续运行下一行程序,任务在后台运行
p.apply_async(func_name,(args))
这里任务在后台执行,如果后面没有任何其他程序,可能程序进行到这里,会被终止,实际上函数并没有运行完
如果需要等它运行完:
p.close() # 表示p不再接受新任务了
p.join() # 表示等待p中的任务运行完
取得返回值
task=p.apply_async(func_name,(args))
result=task.get()
如果后面没有其他程序,这里有get(),也会等待task执行完成,而不是直接终止任务
多进程的底层开启方式
windows只能spawn新进程,会调用同一个py文件,因此需要把程序写在if __name__=='__main__':中,而且不能在交互式时候用,因为它没有程序文件可以spawn嘛
*nix可以用fork(默认),因此不写__main__也能用