Python進程池Pool


 

 

'''
進程池,啟動一個進程就要克隆一份數據,假設父進程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。進程池中進程執行完后再關閉,如果注釋,那么程序直接關閉

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM