• python进程池


    apply与apply_async

    说明:
    1.apply方法是阻塞的
    2.apply_async是异步非阻塞的

    那就是因为apply是阻塞的所以,程序执行会等待所有子程序执行完,再进入主程序

    import time
    from multiprocessing import Pool
    def down_load(move_name):
        #下载器
        for i in range(5):
            print('电影名:{},下载进度{}'.format(move_name,(i/4*100)))
            time.sleep(0.5)
        return move_name
    
    if __name__ == '__main__':
    
        movie_list = ['西红柿首付','功夫熊猫','囧吗','泰囧','红海行动']
        pool = Pool(10)
    
        for movie_name in movie_list:
            #调用进程池
            pool.apply(down_load,(movie_name,))#非阻塞 &apply阻塞
        for i in range(5):
            time.sleep(0.5)
            print(i)
        pool.close()
        pool.join()
    

    运行结果:
    B:pythonAfly_1venvScriptspython.exe B:/pythonWork/进程/京城吃.py
    电影名:西红柿首付,下载进度0.0
    电影名:西红柿首付,下载进度25.0
    电影名:西红柿首付,下载进度50.0
    电影名:西红柿首付,下载进度75.0
    电影名:西红柿首付,下载进度100.0
    电影名:功夫熊猫,下载进度0.0
    电影名:功夫熊猫,下载进度25.0
    电影名:功夫熊猫,下载进度50.0
    电影名:功夫熊猫,下载进度75.0
    电影名:功夫熊猫,下载进度100.0
    电影名:囧吗,下载进度0.0
    电影名:囧吗,下载进度25.0
    电影名:囧吗,下载进度50.0
    电影名:囧吗,下载进度75.0
    电影名:囧吗,下载进度100.0
    电影名:泰囧,下载进度0.0
    电影名:泰囧,下载进度25.0
    电影名:泰囧,下载进度50.0
    电影名:泰囧,下载进度75.0
    电影名:泰囧,下载进度100.0
    电影名:红海行动,下载进度0.0
    电影名:红海行动,下载进度25.0
    电影名:红海行动,下载进度50.0
    电影名:红海行动,下载进度75.0
    电影名:红海行动,下载进度100.0
    0
    1
    2
    3
    4

    然后apply_async 是异步非阻塞的,就是不用等待当前进程执行完毕,随时根据系统调度来进行进程切换。

    import time
    from multiprocessing import Pool
    def down_load(move_name):
        #下载器
        for i in range(5):
            print('电影名:{},下载进度{}'.format(move_name,(i/4*100)))
            time.sleep(1)
        return move_name
    
    def alert(move_name):
        print('恭喜《{}》下载结束'.format(move_name))
    
    if __name__ == '__main__':
        movie_list = ['西红柿首付','功夫熊猫','囧吗','泰囧','红海行动']
        pool = Pool(3)
        for movie_name in movie_list:
            #调用进程池
            pool.apply_async(down_load,(movie_name,),callback=alert)#非阻塞 &apply阻塞
        for i in range(5):
            time.sleep(0.5)
            print(i)
        pool.close()
        pool.join()
    

    运行结果:
    电影名:西红柿首付,下载进度0.0
    电影名:功夫熊猫,下载进度0.0
    电影名:囧吗,下载进度0.0
    0
    1
    电影名:西红柿首付,下载进度25.0
    电影名:功夫熊猫,下载进度25.0
    电影名:囧吗,下载进度25.0
    2
    3
    电影名:西红柿首付,下载进度50.0
    电影名:功夫熊猫,下载进度50.0电影名:囧吗,下载进度50.0

    4
    电影名:西红柿首付,下载进度75.0
    电影名:囧吗,下载进度75.0电影名:功夫熊猫,下载进度75.0

    电影名:西红柿首付,下载进度100.0
    电影名:功夫熊猫,下载进度100.0
    电影名:囧吗,下载进度100.0
    电影名:泰囧,下载进度0.0
    恭喜《西红柿首付》下载结束
    电影名:红海行动,下载进度0.0
    恭喜《功夫熊猫》下载结束
    恭喜《囧吗》下载结束
    电影名:泰囧,下载进度25.0
    电影名:红海行动,下载进度25.0
    电影名:泰囧,下载进度50.0
    电影名:红海行动,下载进度50.0
    电影名:泰囧,下载进度75.0
    电影名:红海行动,下载进度75.0
    电影名:泰囧,下载进度100.0
    电影名:红海行动,下载进度100.0
    恭喜《泰囧》下载结束
    恭喜《红海行动》下载结束

    从效率来看apply_async明显快于apply
    区别就在于
    apply:首先主进程开始运行,碰到子进程,操作系统切换到子进程,等待子进程运行结束后,在切换到另外一个子进程,直到所有子进程运行完毕。然后在切换到主进程,运行剩余的部分。

    apply_async:首先主进程开始运行,碰到子进程后,主进程说:让我先运行个够,等到操作系统进行进程切换的时候,在交给子进程运行。以为我们的程序太短,然而还没等到操作系统进行进程切换,主进程就运行完毕了。

    最后就是close必须在join前调用。

    爱,就是你和某个人一起经历的一切。
  • 相关阅读:
    Javascript实现图片的预加载的完整实现
    python模块查找机制探究
    网络协议模拟之QQ微博分享接口应用
    每周一荐:差异利器Beyond Compare
    Asp.Net MVC4 入门介绍
    单元测试一例:学习断言、测试用例函数的编写
    开源一个网络框架
    .NET服务端持续输出信息到客户端
    Python服务器改造
    CYQ.Data 数据框架 V4.0
  • 原文地址:https://www.cnblogs.com/afly-8/p/13561138.html
Copyright © 2020-2023  润新知