下面對python程序進行深入而仔細的學習,首先先讓大家了解下什麼是python程序,以及在對python程序進行處理時注意的相關問題,接下來,就由我給大家進行介紹學習,僅供大家學習。
不過,雖然程序可在單獨的記憶體空間中執行,但除非這些python程序在單獨的處理器上執行,否則,實際並不是「同時」執行的。是由作業系統把處理器的時間片分配給乙個程序,用完時間片後就需退出處理器等待另乙個時間片的到來。
另一種方式是在在程式中指定多個「執行執行緒」,讓它們在相同的記憶體空間中工作。這稱為「多執行緒處理」。執行緒比程序更有效,因為作業系統不必為每個執行緒建立單獨的記憶體空間。新建程序用os.fork函式。但它只在posix系統上可用,在windows版的python中,os模組沒有定義os.fork函式。相反,windows程式設計師用多執行緒程式設計技術來完成併發任務。
os.fork函式建立程序的過程是這樣的。程式每次執行時,作業系統都會建立乙個新程序來執行程式指令。程序還可呼叫os.fork,要求作業系統新建乙個程序。父程序是呼叫os.fork函式的程序。父程序所建立的程序叫子程序。
每個程序都有乙個不重複的程序id號。或稱pid,它對程序進行標識。子程序與父程序完全相同,子程序從父程序繼承了多個值的拷貝。如全域性變數和環境變數。兩個程序的唯一區別是fork的返回值。子程序接收返回值0,而父程序接收子程序的pid作為返回值。
用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來執行系統命令,然後在命令結束之後把控制權返回給原始程序;os.exec函式族在執行完命令後不將控制權返回給呼叫程序。它會接管python程序,pid不變。這兩個函式支援unix和windows平台。
os.popen()函式可執行命令,並獲得命令的stdout流。函式要取得兩個引數,乙個是要執行的命令,另乙個是呼叫函式所用的模式。如「r"唯讀模式。os.popen2()函式執行命令,並獲得命令的stdout流和stdin流。函式返回乙個元組,其中包含有兩個檔案物件,乙個物件對應stdin流,乙個物件對應stdout流。
程序使用ipc機制在程序間傳遞資訊,一種ipc機制是「管道」,它是一種類似於檔案的物件,提供單向通訊渠道。父程序可開啟乙個管道,再分支乙個子程序。父程序使用管道將資訊寫入(傳送到)子程序,而子程序使用管道從父程序讀取資訊。在python中使用os.pipe函式建立管道。
os._exit()類似於sys.exit(),但它不執行任何的清除工作(例如重新整理緩衝區)。所以os._exit()尤其適用於退出子程序。如果程式使用sys.exit(),作業系統會**父程序或其它子程序可能仍然需要的資源。傳給os._exit()函式的引數必須是程序的退出狀態。退出狀態為0,表示正常終止。
程序也可用訊號進行通訊。所謂「訊號」,是作業系統採取非同步方式傳給程式的訊息。如ctrl+c會傳遞乙個「中斷訊號」,通常該訊號導致程式中止。然而程式完全可以指定用不同的行動來響應任何乙個訊號。在訊號處理中,程式要接收訊號,並根據那個訊號採取一項行動。
錯誤(例如向已關閉管道寫入)、事件(例如計時器變成0)以及使用者輸入(例如按ctrl+c)都會產生訊號。針對每個訊號,每個python程式都有乙個預設的訊號處理程式,並不是所有作業系統。
都能從乙個正在執行的程式建立單獨的程序,所以,程序管理是移植性最差的一項python程序特性。每個系統都定義了特有訊號集。signal是依賴於具體平台的模組,其中只包含系統定義的訊號。
fork 是 python linux下 os 模組下的乙個方法,用來建立乙個子程序。
1、有時,程式在乙個程序中執行可能會遇到一些問題。如程序可能會占用過多的記憶體或者開啟太多的檔案,或者根本無法執行。
2、一般來說,需要將程序分為兩個,在子程序中執行一些**,然後向父程序總返回結果。
這個過程是通過管道來實現的。os.pipe()建立乙個管道。乙個管道包括兩個端,乙個讀(父程序)乙個寫(子程序)。子程序將結果寫入寫端,然後關閉之。父程序從讀端讀出。
以os.fork()建立新程序,複製所有檔案描述符。則父子程序都有了管道的讀端和寫端的拷貝。直到管道一端的所有拷貝都被關閉,那麼管道才關閉,因而在建立子程序之後需要呼叫os.close()關閉父程序的寫端。
所以,執行過程是:
---建立管道
---建立子程序。
子程序:
----需要關閉管道讀端
----開始執行
----向寫端寫入結果
----程序死亡
父程序:
----關閉管道寫端
----從讀端讀取資料直到子程序死亡或者關閉
----呼叫waitpid方法確保子程序已經被撤銷(在freebsd中不這麼做,那麼子程序永遠不會被死亡)
----程序輸出
3、**
#!/usr/bin/env python
import os, sys
print "i'm going to fork now - the child will write something to a pipe, and the parent will read it back"
r, w = os.pipe() # r,w是檔案描述符, 不是檔案物件
pid = os.fork()
if pid:
# 父程序
os.close(w) # 關閉乙個檔案描述符
r = os.fdopen(r) # 將r轉化為檔案物件
print "parent: reading"
txt = r.read()
os.waitpid(pid, 0) # 確保子程序被撤銷
else:
# 子程序
os.close(r)
w = os.fdopen(w, 'w')
print "child: writing"
w.write("here's some text from the child")
w.close()
print "child: closing"
sys.exit(0)
print "parent: got it; text =", txt
詳解Python的多工程序
目錄 定義含義併發 concurrency,同一時刻只能有一條指令執行,但是多個執行緒的對應的指令被快速輪換地執行並行parallel,同一時刻,有多條指令在多個處理器上同時執行,並行必須要依賴於多個處理器阻塞程式未得到所需計算資源時被掛起的狀態非阻塞程式在等待某操作過程中,自身不被阻塞,可以繼續處...
Python多程序機制例項詳解
在以前只是接觸過python的多執行緒機制,今天搜了一下多程序,相關文章好像不是特別多。看了幾篇,小試了一把。程式如下,主要內容就是通過producer讀乙個本地檔案,一行一行的放到佇列中去。然後會有相應的worker從佇列中取出這些行。import multiprocessing import o...
python 程序 python程序
python程序池pool 當需要建立的子程序數量不多時,可以直接利用multiprocessing中的process動態生成多個程序,但如果是上百甚至上千個目標,手動的去建立程序的工作量巨大,此時就可以用到multiprocessing模組提供的pool方法。初始化pool是,可以指定乙個最大程序...