fork()生成進(jìn)程只適用于liunx系統(tǒng)金句,要想跨平臺使用多進(jìn)程需要導(dǎo)入multiprocessing模塊。
和fork產(chǎn)生的進(jìn)程不同吕嘀,利用Process產(chǎn)生的進(jìn)程违寞,主進(jìn)程會等待子進(jìn)程執(zhí)行完畢。
也可利用子類來創(chuàng)建進(jìn)程偶房,自定義類繼承Process,重寫run()方法趁曼,當(dāng)進(jìn)程start()時(shí)會自動調(diào)用run方法。
每個(gè)進(jìn)程都有獨(dú)立的系統(tǒng)資源棕洋,各進(jìn)程間的變量不共享互不影響挡闰。
join()方法可以等待子進(jìn)程結(jié)束后才繼續(xù)往下走,用于進(jìn)程間的同步拍冠。
1 from multiprocessing import Process 2 import time 3 def test(): 4 while True: 5 print('test') 6 time.sleep(1) 7 8 p = Process(target=test) 9 p.start() 10 11 while True: 12 print('main') 13 time.sleep(1)
Process的參數(shù)有:
- target
所調(diào)用的對象 - args
調(diào)用函數(shù)對象的元組參數(shù) - kwargs
調(diào)用函數(shù)對象的關(guān)鍵字參數(shù)字典 - name
進(jìn)程實(shí)例的別名
Process常用屬性尿这,方法
- is_alive()
進(jìn)程是否還在執(zhí)行 - join([timeout])
等待進(jìn)程結(jié)束,或等待多少秒 - start()
- run()
沒有給定target,執(zhí)行對象中的run()方法 - terminate()
立即終止 - name
- pid
進(jìn)程池Pool
用于創(chuàng)建多個(gè)進(jìn)程
3 from multiprocessing import Pool 4 import time 5 import os 6 7 def worker(num): 8 time.sleep(1) 9 print('工人 = %d庆杜,任務(wù) = %d '%(os.getpid(),num)) 10 11 pa = Pool(3) 12 for i in range(10): 13 print(i) 14 pa.apply_async(worker,(i,)) 15 print('start') 16 pa.close() 17 pa.join() 18 print('end ')
multiprocess.Pool常用函數(shù)
- apply_async(func,args,kwds)
使用阻塞方式調(diào)用func - close()
關(guān)閉Pool,不能繼續(xù)添加新任務(wù) - terminate()
- join(): 主進(jìn)程阻塞射众,等待子進(jìn)程結(jié)束,必須在close或terminate之后使用
主進(jìn)程不等待子進(jìn)程