Python中的程序分支fork和exec詳解

2022-10-04 23:15:28 字數 2919 閱讀 8085

在python中,任務併發一種方式是通過程序分支來實現的.在linux系統在,通過fork()方法來實現程序分支.

1.fork()呼叫後會建立乙個新的子程序,這個子程序是原父程序的副本.子程序可以獨立父程序外執行.

2.fork()是乙個很特殊的方法,一次呼叫,兩次返回.

3.fork()它會返回2個值,乙個值為0,表示在子程序返回;另外乙個值為非0,表示在父程序中返回子程序id.

以下只能在linux中執行,不能在window下執行.

程序分支fork()

例項如下:

複製** **如下:

#!/usr/bin/python

#coding=utf-8

import os

def child():

print('hello from child', os.getpid()www.cppcns.com)

os._exit(0)

def parent():

pid = os.fork()

if pid == 0:

child()

print 'fork child process error!'#如果列印該字串,說明呼叫child()出錯

else:

print('hello from parent', os.getpid(), pid)

parent()

執行結果如下:

複製** **如下:

('hello from parent', 29888, 29889)

('hello from child', 29889)

從結果不難看出, child()後的print字元並沒有列印處理,說明呼叫child()是沒有返回的.

fork和exec的組合

從上面的例子來看,呼叫child()方法後就直接退出了.但在實際的應用中,我們希望分支出來的子程序能獨立執行另外乙個新的程式.這時需要用到exec方法替換子程序,並且替換後程序的pid不會改變.exec方法不會返回.

首先解釋一下exec相關的8個方法組:

os.execv(program, cmdargs)

基本的」v」執行形式,需要傳入可執行的程式名,以及用來執行程式的命令列引數字元的列表或元組.

os.execl(program, cmdarg1, cmdarg2, …, cmdargn)

基本的」l」執行形式,需要傳入可執行的程式名,以及用來執行程式的命令列多個字元引數.

os.execvp(program, args)

「p」模式下,基本的」v」執行形式,需要傳入可執行的程式名,以及用來執行程式的命令列引數字元的列表或元組.執行新程式的搜尋路徑為當前檔案的搜尋路徑.

os.execlp(program, cmdarg1, cmdarg2, …, cmdargn)

「p」模式下,基本的」l」執行形式,需要傳入可執行的程式名,以及用來執行程式的命令列多個字元引數.執行新程式的搜尋路徑為當前檔案的搜尋路徑.

os.execve(program, args, env)

「e」模式下,基本的」v」執行形式,需要傳入可執行的程式名,以及用來執行程式的命令列引數字元的列表或元組.最後還要傳入執行新程式的需要的環境變數env字典引數.

os.execle(program, cmdarg1, cmdarg2, …, cmdargn, env)

「e」模式下,基本的」l」執行形式,需要傳入可執行的程式名,以及用來執行程式的命令列多個字元引數.最後還要傳入執行新程式的需要的環境變數env字典引數.

os.execvpe(program, args, env)

在」p」和」e」的組合模式下,基本的」v」執行形式,需要傳入可執行的程式名,以及用來執行程式的命令列參程式設計客棧數字符的列表或元組.最後還要傳入執行新程式的需要的環境變數env字典引數.執行新程式的搜尋路徑為當前檔案的搜尋路徑.

os.execlpe(program, cmdarg1, cmdarg2, …, cmdargn, env)

在」p」和」e」的組合模式下,基本的」l」執行形式,需要傳入可執行的程式名,以及用來執行程式的命令列多個字元引數.最後還要傳入執行新程式的需要的環境變數env字典引數.執行新程式的搜尋路徑為當前檔案的搜尋路徑.

newprocess.py**如下:

複製** **如下:

#!/usr/bin/python

#c程式設計客棧oding=utf-8

import os

def child():

print('hello from child', os.getpid())

os._exit(0)

child()

主**如下:

複製** **如下:

#!/usr/bin/python

#coding=utf-8

import os

def child():

print('hello from child', os.getpid())

os._exit(0)

def parent():

pwww.cppcns.comid = os.fork()

if pid == 0:

os.execlp('python', 'pythonybbapp', 'newprocess.py')

assert false, 'fork child process error!'

else:

print('hello from parent', os.getpid(), pid)

parent()

輸出如下:

複製** **如下:

$ python testfork.py

('hello from parent', 30791, 30792)

$ ('hello from child', 30792)

本文標題: python中的程序分支fork和exec詳解

本文位址:

python中的分支判斷

在python中,要構造分支結構可以使用if elif和else關鍵字,所謂的關鍵字就是有特殊含義的的單詞,像if和else就是專門用於構造分支結構的的關鍵字,很顯然你不能夠使其作為變數使用 如果非要作變數可以加一些字元進行組合使用 例子 user name input 請輸入使用者名稱 passw...

python中的程序 Python中程序

程式 程式 編寫完的 稱為程式。程序程序 又稱重量級程序,正在執行中的程式稱為程序。程序的執行會占用記憶體等資源。多個程序同時執行時,每個程序的執行都需要由作業系統按一定的演算法 rr排程 優先數排程演算法等 分配記憶體空間。並行與併發 並行 在多核系統中,每個cpu執行乙個程序,可以理解為cpu的...

python中的程序

乙個程式執行起來後,用到的資源 稱之為程序,它是作業系統分配資源的基本單元。乙個程序中至少有乙個執行緒。1 多程序之間不會修改全域性變數,多程序之間共享資源用 訊息佇列 先進先出,後進後出 queue。2 結論 每個子程序在執行前都會複製乙份主程序 多程序之間特別占用資源。建立程序 1 匯入mult...