python多進程--------linux系統中python的os.fork()方法


linux下python 創建子進程的原理: os.fork()方法 的原理

為了實現並發、多任務,我們可以在主程序種開啟一個進程或者線程。
在類unix操作系統當中(非windows),可以用python的os.fork() 方法 在主進程上創建一個子進程

os.fork():
這句話執行過后,就會創建出一個新的進程來,被我們創建出來的進程我們叫她子進程,當前進程我們叫它主進程
子進程會復制主進程所有內容,包括代碼、變量、各種資源。他們兩個一摸一樣,
兩個進程此時同時從os.fork()結束的那個時間點向下執行相同的代碼。
這個方法有一個返回值,在主進程中接收到的返回值是子進程的pid、子進程中接收到的是0
獲得當前進程的pid: os.getpid()
獲得當前進程父進程的pid: os.getppid()

執行下面代碼,如果在ide中,發現子進程不一定會不會輸出信息。如果在終端中,發現子進程信息和主進程信息都會輸出。
因為兩個進程之間相互獨立,我們能控制的只是當前主進程,如果主進程子進程先結束了,就不等子進程的輸出消息了。
1 import os 2 pid = os.fork() 3 if pid == 0: 4     print("我是子進程%s,我的父進程是%s"%(os.getpid,os.getppid ) ) 5 else: 6     print("我是父進程%s,我創建了子進程%s"%( os.getpid,pid ))

 

進程產生垃圾:
僵屍進程: 子進程先死掉,父進程還沒死掉的父進程
孤兒進程:父進程死了,子進程還沒死掉的子進程

在操作系統中,子進程死掉后,內存等資源都由父進程進行管理回收和釋放
如果子進程還沒結束,父進程就運行結束了,那么創建出來的子進程就會產生系統垃圾沒有其它進程負責釋放
所以 主進程創建出來的子進程要主進程自己進行管理,把他們收集回收資源
父進程用os.wait() 可以進行資源回收,會返回兩個值 進程的pid 和 一個整數:0代表成功 負數代表失敗
 1 import os  2 
 3 pid = os.fork()  4 #子進程會進入這個分支
 5 if pid == 0 :  6     print("我是子進程%s,我的父進程是%s"%( os.getpid(),os.getppid() ))  7 #父進程會進入這個分支
 8 else :  9     print("我是父進程%s,我創建了子進程%s"%( os.getpid(),pid )) 10     print("我要收集子進程資源:") 11     son_pid , result = os.wait() 12     print(son_pid , result )

 

 

進程之間不共享變量:
進程是獨立占一部分內存空間的
如果我們在主進程中創建一個子進程,子進程是在當前主進程之外申請了一塊額外內存,把主進程所有代碼和資源復制一份自己來運行。
所以,主進程和子進程是不共享全局變量的。他們分別在自己的內存空間當中維護自己的變量空間
 1 import os  2 import time  3 num = 100
 4 pid = os.fork()  5 #子進程當中
 6 if pid == 0 :  7     print("這里是子進程:")  8     print(num)  9     num = 10
10     print( num ) 11 #主進程中
12 else: 13     time.sleep(3) 14     print("這里是主進程:") 15     print( num )

 

 

在程序中多次調用fork()
一共會產生多少進程???

當一個進程調用了fork() 都會生成另一個子進程
然后當前進程和子進程同時fork()語句繼續向下執行
1 import os 2 os.fork()  #主進程會產生一個子進程,兩個進程從這里開始繼續向下進行
3 os.fork() #兩個進程到這里,分別會給自己創建一個子進程,結果 會有四個進程從這里繼續向下
4 os.fork() # 四個進程到這里,每個進程都會給自己再創建一個子進程。結果會形成八個進程
5 print("哈哈哈")    #會打印出八條哈哈哈

 





 


免責聲明!

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



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