1. 程式人生 > >Python之OS模組程序管理介紹--os.fork()

Python之OS模組程序管理介紹--os.fork()

轉自:http://davidbj.blog.51cto.com/4159484/1240586

有兩種方式來實現併發性,一種方式是讓每個“任務"或“程序”在單獨的內在空間中工作,每個都有自已的工作記憶體區域。不過,雖然程序可在單獨的記憶體空間中執行,但除非這些程序在單獨的處理器上執行,否則,實際並不是“同時”執行的。是由作業系統把處理器的時間片分配給一個程序,用完時間片後就需退出處理器等待另一個時間片的到來。另一種方式是在在程式中指定多個“執行執行緒”,讓它們在相同的記憶體空間中工作。這稱為“多執行緒處理”。執行緒比程序更有效,因為作業系統不必為每個執行緒建立單獨的記憶體空間。
新建程序用os.fork函式。但它只在POSIX系統上可用,在windows版的python中,os模組沒有定義os.fork函式。相反,windows程式設計師用多執行緒

程式設計技術來完成併發任務。os.fork函式建立程序的過程是這樣的。程式每次執行時,操作系統都會建立一個新程序來執行程式指令。程序還可呼叫os.fork,要求作業系統新建一個程序。父程序是呼叫os.fork函式的程序。父程序所建立的程序叫子程序。每個程序都有一個不重複的程序ID號。或稱pid,它對程序進行標識。子程序與父程序完全相同,子程序從父程序繼承了多個值的拷貝,如全域性變數和環境變數。兩個程序的唯一區別是fork的返回值。子程序接收返回值0,而父程序接收子程序的pid作為返回值。一個現有程序可以呼叫fork函式建立一個新程序。由fork建立的新程序被稱為子程序(child process)。fork函式被呼叫一次但返回兩次。兩次返回的唯一區別是子程序中返回0值而父程序中返回子程序ID。 對於程式,只要判斷fork的返回值,就知道自己是處於父程序還是子程序中。
子程序是父程序的副本,它將獲得父程序資料空間、堆、棧等資源的副本。注意,子程序持有的是上述儲存空間的“副本”,這意味著父子程序間不共享這些儲存空間,它們之間共享的儲存空間只有程式碼段。用os.fork建立的子程序和父程序作為非同步的併發程序而單獨執行。非同步是指它們各行其是,相互間不進行同步;併發是指它們可同時執行。所以我們無法知道子程序和父程序的相對速度。os.wait函式用於等待子程序結束(只適用於UNIX相容系統)。該函式返回包含兩個元素的元組,包括已完成的子程序號pid,以及子程序的退出狀態,返回狀態為0,表明子程序成功完成。返回狀態為正整數表明子程序終止時出錯。如沒有子程序,會引發OSError錯誤。os.wait要求父程序等待它的任何一個子程序結束執行,然後喚醒父程序

    要指示父程序等候一個指定的子程序終止,可在父程序中使用os.waitpid函式(只適用於unix相容系統)。它可等候一個指定程序結束,然後返回一個雙元素元組,其中包括子程序的pid和子程序的退出狀態。函式呼叫將pid作為第一個引數傳遞,並將一個選項作為第二個選項,如果第一個引數大於 0,則waitpid會等待該pid結束,如果第一個引數是-1,則會等候所有子程序,也就和os.wait一樣。
    
用os.system 和 os.exec函式族來執行系統命令和其它程式。os.system使用shell來執行系統。