一、前言
進程池內部維護一個進程序列,當使用時,則去進程池中獲取一個進程,如果進程池序列中沒有可供使用的進程,那么程序就會等待,直到進程池中有可用進程為止。進程池的作用可以在多進程程序中有效的控制進程運行的個數,維護系統的穩定。
二、multiprocessing.pool
2.1 apply(func, args=(), kwds={})
默認阻塞,所有進程是串行的,不建議使用
from multiprocessing import Pool
import time
import os
def foo(i):
time.sleep(2)
print('in process', os.getpid())
return i + 100
if __name__ == '__main__': # windows 運行進程池一定要加這
pool = Pool(5) # 進程池中進程個數為5,多余的進程先掛起
for i in range(10):
pool.apply(func=foo, args=(i,))
print('end')
pool.close()
pool.join() # 進程池中進程執行完畢后再關閉,如果注釋,那么程序直接關閉。
注:所有進程會依次運行,主進程等待所有進程結束
2.2 apply_async(func, args=(), kwds={}, callback=None, error_callback=None)
非阻塞,進程池中的進程並行,支持回調
from multiprocessing import Pool
import time
import os
def foo(i):
time.sleep(1)
print('in process', os.getpid())
return i + 100
if __name__ == '__main__': # windows 運行進程池一定要加這
pool = Pool(5) # 進程池中進程個數為5,多余的進程先掛起
for i in range(10):
pool.apply_async(func=foo, args=(i,))
print('end')
pool.close()
pool.join() # 進程池中進程執行完畢后再關閉,如果注釋,那么程序直接關閉。
三、回調函數
在apply_async中執行回調函數,每執行完一個子進程,主進程就調用一下回調函數,回調函數執行完后再執行下一個子進程
# -*- coding: UTF-8 -*-
from multiprocessing import Pool
import time
import os
def foo(i):
time.sleep(1)
print('in process', os.getpid())
return i + 100
def bar(arg): # 增加的回到函數, 其實回調函數是主進程執行的
print('-->exec done:', arg, os.getpid())
if __name__ == '__main__': # windows 運行進程池一定要加這
pool = Pool(5) # 進程池中進程個數為5,多余的進程先掛起
print('main process pid,', os.getpid())
for i in range(10):
pool.apply_async(func=foo, args=(i,), callback=bar)
# pool.apply(func=foo, args=(i,))
print('end')
pool.close()
pool.join() # 進程池中進程執行完畢后再關閉,如果注釋,那么程序直接關閉。
注:通過進程pid可以看出,回調函數其實是由主進程執行的
