標籤:%s 基礎 元組 建立 返回 執行順序 ali code proc
多任務:
frok():只能在linux下執行
import osimport time#在程式運行時,父進程的ID就已經產生完畢了print(‘當前進程是父進程,id是:%s‘%os.getpid())ret = os.fork() #建立一個子進程#ret的值在父進程中是子進程的ID,在子進程中則返回0print(‘ret的值是%s‘%ret)print(‘*‘*50)if ret == 0: #ret值為0,是子進程 print(‘這是一個子進程:%s,他的父進程是:%s‘%(os.getpid(),os.getppid())) time.sleep(1)#os.getpid()是返回當前進程id,os.getppid()是返回當前進程的父進程idelif ret > 0: #ret值大於0,是在父進程中 print(‘這是父進程:%s,子進程的值是:%s‘%(os.getpid(),ret)) time.sleep(1)else: print(‘進程建立失敗‘) time.sleep(1)
如果主進程退出,整個進程就直接退出了,不會因為子進程沒執行完而等待子進程結束後才結束整個進程
子進程中修改的全域變數不會影響到父進程的全域變數,多進程中,資料不共用,如果想共用進程中的資料,需要處理序間通訊
多次fork()的結果:
父進程,子進程執行順序沒有規律,完全看作業系統的調度代碼
multiprocessing 在windows上也能用的多進程模組,他提供了一個Process類來代表一個進程對象,這樣就能實現跨平台開發了
fork()建立的子進程,如果主進程退出,就所有進程退出
Process類建立的子進程,主進程退出後還會繼續執行
from multiprocessing import Processimport osimport time#將子進程要執行的代碼放入函數中def run_proc(name): print(‘子進程運行中,name = %s , pid = %d...‘%(name,os.getpid()))if __name__ == ‘__main__‘: print(‘父進程%d‘%os.getpid()) #建立一個Process的執行個體對象,一個執行個體對象就是一個子進程 p = Process(target=run_proc,args=(‘test‘,)) #傳入的是元組,如果只有一個值,要在結尾加逗號 #target後面放的是子進程要啟動並執行函數 #args放的是target裡函數需要的參數 print(‘子進程開始執行‘) p.start() #開始執行子進程 p.join() #等待子進程結束後才繼續執行後面的函數,通常用於進程同步 print(‘子進程結束執行‘)
執行個體練習:
from multiprocessing import Processimport osimport time#將子進程要執行的代碼放入函數中def run_proc(name,age,**kwargs): for i in range(10): print(‘子進程運行中,name = %s,age=%d,pid = %d...‘%(name,age,os.getpid())) print(kwargs) time.sleep(1) print(‘子進程結束‘)if __name__ == ‘__main__‘: p = Process(target=run_proc,args=(‘test‘,18),kwargs={‘tom‘:‘alice‘}) print(‘子進程將要執行‘) p.start() time.sleep(1) p.terminate() #殺死子進程 p.join() print(‘父進程結束‘)
發現子進程就運行了一秒後就被強行結束了,結束後執行輸出父進程結束,如果沒有調用terminate()的話,會等到子進程迴圈完才結束
執行個體練習2:
from multiprocessing import Processimport osimport timedef work_1(interval): print(‘work_1父進程(%s),當前進程(%s)‘%(os.getppid(),os.getpid())) t_start = time.time() #取當前的時間戳記 time.sleep(interval) t_end = time.time() print(‘work_1 執行時間為%.2f秒‘%(t_end-t_start)) print(‘work_1結束‘)def work_2(interval): print(‘work_2父進程(%s),當前進程(%s)‘%(os.getppid(),os.getpid())) t_start = time.time() #取當前的時間戳記 time.sleep(interval) t_end = time.time() print(‘work_2 執行時間為%.2f秒‘%(t_end-t_start)) print(‘work_2結束‘)if __name__ == ‘__main__‘: print(‘當前程式ID(父進程):%s‘%os.getpid()) p1 = Process(target=work_1,args=(2,)) p2 = Process(target=work_2,name=‘dd‘,args=(3,)) #name參數是給進程取個進程名,沒有調用的話程式會預設產生Process-x的程式名 p1.start() p2.start() print(‘p1.name=%s‘%p1.name) print(‘p1.pid=%d‘%p1.pid) print(‘p2.name=%s‘%p2.name) print(‘p2.pid=%d‘%p2.pid) print(‘主進程結束‘)
python基礎學習3