老师您好,关于讲义中进程池的这段代码三段不明白
图上代码的疑问:
主进程的任务是执行第13行至第18行代码,第14行是创建进程池,第15、16行是创建20个任务分别在5个进程中进行执行,那至少会完成5个进程的任务后,主进程才会关闭吧?为什么主进程在创建完进程池后,就直接关闭了呢?第一次循环生成的这5个任务应该可以被打印呀?
图上代码疑问:
1、第21行在遍历results列表后,为什么不能直接打印res来获取列表中的元素呢?
2、还有这段代码的运行流程我还有点不太明白,第17行是主进程运行,第18行是创建20个任务,分配给5个子进程执行,然后这5个任务完成后执行第19行代码,把返回值加入列表中,这个时候第二轮的5个任务又开始执行了,在执行的同时,又执行了主进程的任务,也就是第21、22行的代码,是这个意思吗老师?
3、老师问什么使用了这种方法,就不同调用pool.close()和pool.join()函数了呢?
图上代码疑问:
老师第16、17行代码是将multiprocessing中的Manager类进行实例化,然后再将Manager类中的Lock类进行实例化吗?可以lock = multiprocessing.Manager().Lock()这样写吗?
正在回答 回答被采纳积分+1
同学,你好!
1、apply_async是异步非阻塞式的。首先主进程开始运行,碰到子进程后,主进程说:让我先运行个够,等到操作系统进行进程切换的时候,在交给子进程运行。首先运行的是主进程,cpu运行很快,完全没有给操作系统进程切换的机会,主进程就运行完毕了,整个程序结束。子进程完全没有机会切换到程序就已经结束了,因此没有打印子进程中的内容
2、pool.apply_async()方法返回的是一个对象<multiprocessing.pool.ApplyResult object at xxxxx>,需要通过调用get()函数得到每个返回结果的值。
3、在第二轮执行时不会执行主进程,主进程会等待所有子进程运行完毕后,最后切换回主进程,执行剩余部分。
4、pool.close() # 关闭进程池,表示不能再往进程池中添加进程,需要在join之前调用
pool.join() # 等待进程池中的所有进程执行完毕
这是由于results是在主进程中执行的,导致一定会使其它进程走完,主程序才会结束。因此就不用再增加pool.close()和pool.join()了。
5、multiprocessing.Manager()是得到一个manager对象,通过该对象调用Lock()方法创建锁。
使用multiprocessing.Manager().Lock()也是可以的
祝学习愉快!
- 参与学习 人
- 提交作业 5211 份
- 解答问题 2433 个
Facebook曾声称“只招全栈工程师”!全栈用人需求猛增,市面人才紧缺。 0基础进击Python全栈开发,诱人薪资在前方!
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星