参阅网址
blog.csdn.net/weixin_3711…
1/二者的差异
apply():
非异步(子进程不是一起履行的),堵塞主进程。
它的非异步体现在:一个一个按次序履行子进程, 子进程不是一起履行的。
它的堵塞体现在:比及悉数子进程都履行完毕后,持续履行apply()后边主进程的代码。
apply_async():
异步的,不堵塞主进程。
它的异步体现在:子进程之间是一起履行的。子进程被分配到不同的cpu上被履行。
它的非堵塞体现在:他不会等候子进程完全履行完毕, 主进程会持续履行, 他会依据体系调度来进行进程之间的切换。如果想堵塞首要进程,需要用.join()函数来堵塞主进程。
2/apply()
import time
import multiprocessing
def doIt(num):
print("Process num is : %s" % num)
time.sleep(1)
print('process %s end' % num)
if __name__ == '__main__':
print('mainProcess start')
#记载一下开端履行的时间
start_time = time.time()
# 创立一个进程池,答应最多能够有3个子进程能够一起履行。
pool = multiprocessing.Pool(3)
print('Child start')
for i in range(3):
pool.apply(doIt,[i])
print('mainProcess done time:%s s' % (time.time() - start_time))
成果如下所示:
从成果中咱们能够看到,主进程开端履行之后, 创立的三个子进程也随即开端履行, 后边的主进程被堵塞。
并且三个子进程是一个接一个按次序地履行, 比及子进程悉数履行完毕之后, 后边的主进程才会持续履行, 打印出最终一句。
所以,apply()函数果然是能够堵塞主进程,并且是非异步的。
3/apply_async()
望文生义,async便是异步的意思。
接下来是运用apply_async(), 只需要把上面的代码运用 apply()的当地改成apply_async() 即可, 代码不再贴上
咱们来看看运转成果, 能够看出来, 截图的榜首句是上一个程序(也便是apply()函数)的履行耗费时间,
最终一句是运用apply_async()所耗费的时间,
在这里, 主进程没有被堵塞, 验证了apply_async()是非堵塞主进程的, 子进程没有履行, 验证了他是依据体系调度完成的, 为什么会这样呢?
原因是, 进程的切换时操作体系控制的, 咱们首要运转的是主进程, 而CPU运转得又很快, 快到还没等体系调度到子线程, 主进程就已经运转完毕了, 并且退出程序. 所以子进程就没有运转了.
那么咱们在运用apply_async()函数是不是就不能履行子进程呢?肯定能够啊!!!小老弟,想啥呢??
还记得join()的作用吗?他能够堵塞主进程, 等候所有子进程完毕之后再运转,
join()便是告诉主进程老子要运转子进程了,你先等等。
import time
import multiprocessing
def doIt(num):
print("Process num is : %s" % num)
time.sleep(1)
print('process %s end' % num)
if __name__ == '__main__':
print('mainProcess start')
#记载一下开端履行的时间
start_time = time.time()
# 创立一个进程池,最大答应3个子进程一起履行。
pool = multiprocessing.Pool(3)
print('Child start')
for i in range(3):
pool.apply_async(doIt,[i])
pool.close()
pool.join()
print('mainProcess done time:%s s' % (time.time() - start_time))
成果如下所示:
咱们看看参加这两句的运转成果, 咱们能够看到即使是运用了非堵塞主进程的apply_async() 也能让子进程运转完毕之后再履行主进程了。
CPU在履行榜首个子进程的时候, 还没等榜首个子进程完毕, 体系调度到了按次序调度到了第二个子进程,
以此类推, 一直调度运转子进程, 一个接一个地完毕子进程的运转, 最终运转主进程,
并且咱们能够看到运用apply_async()的履行效能会更高,
你看一下他们各自履行成果最终一句的履行耗费时间就知道了, 这也是官方引荐咱们运用apply_async()的首要原因吧