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前调用。