進程池
阿新 • • 發佈:2017-12-07
回調 def {} 作用 維護 sin 支持 multi 註釋
一、前言
進程池內部維護一個進程序列,當使用時,則去進程池中獲取一個進程,如果進程池序列中沒有可供使用的進程,那麽程序就會等待,直到進程池中有可用進程為止。進程池的作用可以在多進程程序中有效的控制進程運行的個數,維護系統的穩定。
二、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可以看出,回調函數其實是由主進程執行的
進程池