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:\python\Afly_1\venv\Scripts\python.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前调用。

posted @ 2020-02-11 18:58  afly_8  阅读(46)  评论(0编辑  收藏  举报