进程池进阶
进程池
def wahaha(): time.sleep(1) print(os.getpid()) return True if __name__ == '__main__': p = Pool(5) # CPU的个数 或者 +1 ret_l = [] for i in range(20): ret = p.apply_async(func = wahaha) # async 异步的 ret_l.append(ret) for ret in ret_l: print(ret.get())
# 异步的 apply_async
# 1.如果是异步的提交任务,那么任务提交之后进程池和主进程也异步了,
#主进程不会自动等待进程池中的任务执行完毕
# 2.如果需要主进程等待,需要p.join
# 但是join的行为是依赖close
# 3.如果这个函数是有返回值的
# 也可以通过ret.get()来获取返回值
# 但是如果一边提交一遍获取返回值会让程序变成同步的
# 所以要想保留异步的效果,应该讲返回对象保存在列表里,所有任务提交完成之后再来取结果
# 这种方式也可以去掉join,来完成
进程池函数:
from multiprocessing import Pool p = Pool(5) # 创建进程池并且限定进程的个数 ret = p.apply # ret 返回值是可以直接打印的 ,是同步 ret = p.apply_async 返回值是一个内存地址,需要用Get获取 #如果一个一个获取则是同步,加入列表获取则是异步 p.join # 堵塞到子进程结束 p.close # 关闭向操作系统的申请