python3啟動子進程之 os.fork()


 python3啟動子進程之 os.fork()

先了解python3 os.fork()  使用說明

在生物學家開始克隆研究之前,計算機科學家就擁有成功的克隆歷史。他們克隆了進程,盡管他們沒有將其稱為克隆而是fork,fork是Unix和Linux最重要的方面之一。當進程要fork(克隆)時,它會創建自己的副本,更一般而言,在多線程(進程)環境中的fock意味着執行的線程(進程)被復制,從而從父線程(進程)創建子線程。它們是相同的,但可以區分開。fork操作為子線程(進程)創建一個單獨的地址空間。子進程具有父進程所有內存的精確副本。父子進程的執行彼此獨立。

這個函數很特殊,調用一次,返回兩次,因為操作系統是將當前的進程(父進程)復制了一份(子進程),然后分別在父進程和子進程內返回。子進程永遠返回0,而父進程返回子進程的 PID。我們可以通過判斷返回值是不是 0 來判斷當前是在父進程還是子進程中執行

  • os.fork() 用於在程序中創建子進程,這個方法在子進程中返回0,在父進程中返回子進程的pid。
  • os.fork()  子進程只執行os.fork() 之后的代碼塊
import os
print('before')
pid=os.fork()
print('after')
print('我的pid',pid)
print('bbb')
before
after
我的pid 58000
bbb
after
我的pid 0
bbb

 說明:程序執行到fork的時候 操作系統對當前的進程(父進程)復制了一份(子進程)地址空間,然后兩個同時執行fork()以后的代碼 ,同時將的fork()不同值返回給父子進程各自pid變量,然后在執行之后的代碼

也就是同時執行

pid=
print('after')
print('我的pid',pid)
print('bbb')

 所以會打印各自的pid 和 兩個 after,bbb

import os
import time
print('before')
os.fork()
print('pid',os.getpid())
os.fork()
print('ppid',os.getppid())

 

 

 

上面會            主進程---fork--->子進程(獨立)

                        |                           |

                      fork                      fork

                        \|/                        \|/

                     子進程                  子進程

 

通過pid  判斷 子進程和父進程 並執行行相應代碼

依據: os.fork() 用於在程序中創建子進程,這個方法在子進程中返回0,在父進程中返回子進程的pid

import os


def  son():
        print('son')
        print(max(2,3))

def father():
        print('father')
        print(min(2, 3))

pid=os.fork()

if pid==0:
        son()
else:
        father()
father
2
son
3

  

 

到目前為止,我們已經在示例中調用了在同一腳本文件中定義的函數。

fork通常用於啟動獨立程序。為此,我們需要exec *()函數。

他們通過用該程序替換當前進程來執行新程序。他們不會返回調用它們的程序。他們甚至收到與調用程序相同的進程ID。

exec函數 參考https://www.python-course.eu/forking.php


免責聲明!

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



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