''' 進程池,啟動一個進程就要克隆一份數據,假設父進程1G,那么啟動進程開銷很大 避免啟動太多造成系統癱瘓,就有進程池,即同一時間允許的進程數量 ps:線程沒有池,因為線程啟動開銷小,線程有類似信號量來控制 ''' ''' windows上必須加語句: if __name__ == '__main__': freeze_support() ''' from multiprocessing import Pool,freeze_support import time import os def Foo(i): time.sleep(2) # print(os.getpid()) return i+100 def Bar(arg): print("hello world",arg) print(os.getpid()) if __name__ == '__main__': freeze_support() pool = Pool(processes=5) # 允許進程池里同時放入5個進程 print(os.getpid()) for i in range(10): # 啟動了但是還沒被允許,因為同一時間只有5個在運行 # pool.apply_async(func=Foo, args=(i,)) # 並行 # pool.apply(func=Foo, args=(i,)) # 串行 pool.apply_async(func=Foo, args=(i,),callback=Bar) # 並行,並且當且僅當Foo執行完后再執行Bar # 回調應用場景:批量備份完后,往數據庫寫日志,但是為啥不讓子線程寫,而讓父進程寫?因為父進程里寫日志只連一次,子進程里每次都連 print('end') pool.close() pool.join() # 這里要先關閉再JOIN。進程池中進程執行完后再關閉,如果注釋,那么程序直接關閉
