在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...