进程理解:

进程理解:

以下对部分语句理解不知道是否正确

完整脚本:

# coding:utf-8

import os
import time
import multiprocessing


def work(count):
    print(count, os.getpid())
    time.sleep(5)


if __name__ == '__main__':
    pool = multiprocessing.Pool(5)
    for i in range(20):
        result = pool.apply_async(func=work, args=(i, ))
        print(i)
    pool.close()
    print('test')
    pool.join()
    print('end')

部分语句理解:

1、根据参数i创建20个进程对象,将进程对象放入pool进程队列中。

此时print(i)会立刻输出, 而pool.apply_async(func=work, args=(i, ))会在队列中  根据work(count)在进程池中  依次执行

    for i in range(20):
        result = pool.apply_async(func=work, args=(i, ))
        print(i)

2、pool.close()会在pool进程队列中没有进程对象才执行

pool.close()未执行时,pool.close()后面的语句可以先执行

print('test')不受子进程影响,直接执行

pool.join阻塞主进程,直到pool进程队列中没有进程对象才停止阻塞

    pool.close()
    print('test')
    pool.join()
    print('end')

因此,脚本运行效果为:

https://img1.sycdn.imooc.com//climg/64701f0609b5e8b901130736.jpg

https://img1.sycdn.imooc.com//climg/64701f0e09e6f40901060539.jpg

https://img1.sycdn.imooc.com//climg/64701fc8098cd39d01050024.jpg

正在回答

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

1回答

同学,你好!1、理解的正确

2、pool.close()关闭的是进程池,使其不接受新的任务。pool.join阻塞主进程,直到所有子进程执行完成,才能执行主进程。即进程池中20个任务执行完成,再执行主程序的print("end")代码。print("test")是主进程代码,不受进程池影响理解是正确的。

祝学习愉快~

  • Mr朱_ 提问者 #1

    1、pool.apply_async(func=work, args=(i, ))会将 work(count) 入列进 pool进程池中的进程队列

    进程队列也是进程池中的一部分

    2、pool.close()在进程池任务执行完成后关闭进程池

    3、pool.join()在进程池任务执行完成前阻塞主进程

    4、pool.close(),pool.join锚定的不是进程队列,具体要看源码

    是这么理解吗?

    2023-05-26 11:34:35
  • 好帮手慕小猿 回复 提问者 Mr朱_ #2

    同学,你好!1、2、3正确,第4点同学可查看源码进行验证


    祝学习愉快~

    2023-05-26 12:09:36
  • Mr朱_ 提问者 回复 好帮手慕小猿 #3

    建议线上课老师将内容讲细一点,不然有些没讲解到的,或者有歧义的内容 很消耗学生的时间。

    比如:根据上下文老师17:56的讲解就很容易让人误解为:res.get()执行完会自动关闭进程池,从而不需要pool.close()和pool.join()。因为这个歧义导致我验证的方向错了,花了我2-3小时的验证时间

        pool.close()  # 进程池 pool 内进程队列运行完毕后关闭进程池。
        # 视频17:56中说不需要是因为res.get()已全部输出,主进程后面又没有任何语句,进程池可以随着主进程关闭而关闭
        print('test')  # pool.close()执行前可继续执行主进程后面的语句
        pool.join()  # pool.join()前必须pool.close()否则报错。因为pool没有close,pool.join就会一直阻塞主进程导致进程停止又不能退出

    完整代码:

    # coding:utf-8
    
    import os
    import time
    import multiprocessing
    
    
    def work(count, lock):
        lock.acquire()  # 上锁
        # Manager.Lock锁会使进程进入独占模式运行,不管进程池可同时运行多少个进程,同一时间只能执行运行一个进程
        print(count, os.getpid())
        time.sleep(5)
        lock.release()  # 解锁
        return 'result is %s, pid is %s' % (count, os.getpid())
    
    
    if __name__ == '__main__':
        pool = multiprocessing.Pool(5)  # 创建进程池,最多可同时运行5个进程
        manger = multiprocessing.Manager()  # 初始化Manager()
        lock = manger.Lock()  # 获取Lock
        results = []
        for i in range(20):
            result = pool.apply_async(func=work, args=(i, lock))
            # 将 work(count) 入列进 pool进程池中的进程队列。这里进程池中的队列有20个进程对象
            # 进程队列也是进程池中的一部分,异步对象创建后不需要start()将自动运行
            # results.append(result)
    
        # for res in results:
        #     print(res.get())  # 返回 ‘进程对象返回的’ 返回值
    
        pool.close()  # 进程池 pool 内进程队列运行完毕后关闭进程池。
        # 视频17:56中说不需要是因为res.get()已全部输出,主进程后面又没有任何语句,进程池可以随着主进程关闭而关闭
        print('test')  # pool.close()执行前可继续执行主进程后面的语句
        pool.join()  # pool.join()前必须pool.close()否则报错。因为pool没有close,pool.join就会一直阻塞主进程导致进程停止又不能退出


    2023-05-26 16:10:48
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

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

在线咨询

领取优惠

免费试听

领取大纲

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