python 在程序間通訊時有很多方式,比如使用queue的訊息佇列,使用 pip的管道通訊,share memory 共享記憶體或 semaphore 訊號量等通訊方式。
這裡我們演示一下通過訊息佇列的方式進行程序間資訊的傳遞。
from multiprocessing import process,queue
import time,random,os
defwrtie
(qu)
:# 寫入資料
print
("child_process write:"
)for i in
["a"
,"b"
,"c"
,"d"
,"end"]:
print
("寫入資料....%s"
%i) qu.put(i)
# 訊息入隊
time.sleep(random.random())
print
("資料寫入完成"
)def
read
(qu)
:# 讀取資料
while qu.empty:
msg=qu.get(
)if msg==
"end"
:print
("讀取結束"
)break
print
("讀取資料 %s"
%msg)
if __name__==
"__main__"
: qu=queue(
100)
# 100容量的資料
pw=process(target=wrtie,args=
(qu,))
pr=process(target=read,args=
(qu,))
pw.start(
) pr.start(
) pw.join(
) pr.join(
)
輸出結果:
寫入資料...
.a讀取資料 a
寫入資料...
.b讀取資料 b
寫入資料...
.c讀取資料 c
寫入資料...
.d讀取資料 d
寫入資料...
.end
讀取結束
資料寫入完成
此外,如果我們想和python 程式外的一些程式進行資料通訊的話,可以使用 subprocess 模組。
比如,使用我們的python 調出我們windows系統自帶的計算器。
import subprocess as sp
sp.call(r"c:\windows\system32\calc.exe"
,shell=
true
)
shell預設為false,在linux下,shell=false時, popen呼叫os.execvp()執行args指定的程式;shell=true時,如果args是字串,popen直接呼叫系統的shell來執行args指定的程式,如果args是乙個序列,則args的第一項是定義程式命令字串,其它項是呼叫系統shell時的附加引數,如在linux下可以使用call(["ls", "-l"])
等同於在執行ls -l
命令。
使用windows的ping命令,通過序列的方式(第乙個為命令,第二個為引數)。
)輸出:
���� ping www.a.shifen.com [
14.215
.177
.39] ���� 32 �ֽڵ�����:
���� 14.215
.177
.39 �ļظ�: �ֽ�=
32 ʱ��=47ms ttl=
55���� 14.215
.177
.39 �ļظ�: �ֽ�=
32 ʱ��=48ms ttl=
55���� 14.215
.177
.39 �ļظ�: �ֽ�=
32 ʱ��=47ms ttl=
55���� 14.215
.177
.39 �ļظ�: �ֽ�=
32 ʱ��=47ms ttl=
5514.215
.177
.39 �� ping ͳ����ϣ:
���ݰ�: �ѷ��� =
4���ѽ��� =
4����ʧ =0(
0% ��ʧ)��
�����г̵ĺ���ʱ��(�ժ���ϊ��λ)
: ��� = 47ms��� = 48ms��ƽ�� = 47ms由於windows的cmd預設使用的是gbk編碼,而python中使用的是utf-8編碼,所以輸出會部分亂碼。
如果想獲得程序執行後的結果可以使用 getoutput() 方法,他的返回值是乙個字串型別,儲存著子程序執行的結果。
輸出:正在 ping www.a.shifen.com [
14.215
.177
.39] 具有 32 位元組的資料:
來自 14.215
.177
.39 的回覆: 位元組=
32 時間=49ms ttl=
55來自 14.215
.177
.39 的回覆: 位元組=
32 時間=47ms ttl=
55來自 14.215
.177
.39 的回覆: 位元組=
32 時間=47ms ttl=
55來自 14.215
.177
.39 的回覆: 位元組=
32 時間=48ms ttl=
5514.215
.177
.39 的 ping 統計資訊:
資料報: 已傳送 =
4,已接收 =
4,丟失 =0(
0% 丟失),
往返行程的估計時間(以毫秒為單位)
: 最短 = 47ms,最長 = 49ms,平均 = 47ms
十 程序間通訊
程序間通訊意味著兩個不同程序間可以交換資料,為了完成這一點,作業系統中應該提供兩個程序可以同時訪問的記憶體空間。通過管道實現程序間通訊 為了完成程序間通訊,需要建立管道。管道並非屬於程序的資源,而是和套接字一樣,屬於作業系統。乙個管道有兩個檔案描述符,用作管道的出口和入口。如下圖,父子程序都可以訪問...
MFC sendmessage實現程序間通訊
用sendmessage實現程序間通訊。實現方式是傳送wm copydata訊息。傳送程式 lresult copydataresult cwnd potherwnd cwnd findwindow null,卡口管理 cstring strdatatosend 0dae12a3d8c9425daa...
Linux學習筆記(程序間通訊)
ipc 程序間通訊 linux下的多個程序間的通訊機制叫做ipc,它是多個程序之間進行相互溝通的一種方法。通過程序間通訊可以實現不同程序之間傳播和交換資訊。程序間通訊的目的 1.資料傳輸 2.資源共享 3.乙個程序需要向另乙個或一組程序傳送訊息,通知它或它們發生了某種事件 4.程序控制 程序間通訊的...