老师您好,关于讲义中进程池的这段代码三段不明白

老师您好,关于讲义中进程池的这段代码三段不明白

http://img1.sycdn.imooc.com//climg/60aa6ba909a7335316410719.jpg

图上代码的疑问:

主进程的任务是执行第13行至第18行代码,第14行是创建进程池,第15、16行是创建20个任务分别在5个进程中进行执行,那至少会完成5个进程的任务后,主进程才会关闭吧?为什么主进程在创建完进程池后,就直接关闭了呢?第一次循环生成的这5个任务应该可以被打印呀?

http://img1.sycdn.imooc.com//climg/60aa6eb109e8dd1116340682.jpg

图上代码疑问:

1、第21行在遍历results列表后,为什么不能直接打印res来获取列表中的元素呢?

2、还有这段代码的运行流程我还有点不太明白,第17行是主进程运行,第18行是创建20个任务,分配给5个子进程执行,然后这5个任务完成后执行第19行代码,把返回值加入列表中,这个时候第二轮的5个任务又开始执行了,在执行的同时,又执行了主进程的任务,也就是第21、22行的代码,是这个意思吗老师?

3、老师问什么使用了这种方法,就不同调用pool.close()和pool.join()函数了呢?

http://img1.sycdn.imooc.com//climg/60aa733a09ffdc9516200953.jpg

图上代码疑问:

老师第16、17行代码是将multiprocessing中的Manager类进行实例化,然后再将Manager类中的Lock类进行实例化吗?可以lock = multiprocessing.Manager().Lock()这样写吗?

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
好帮手慕美 2021-05-24 10:57:12

同学,你好!

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()了。

http://img1.sycdn.imooc.com//climg/60ab13cf095155af07930244.jpg

5、multiprocessing.Manager()是得到一个manager对象,通过该对象调用Lock()方法创建锁。

使用multiprocessing.Manager().Lock()也是可以的

祝学习愉快!

问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师