python學習筆記(十) 程序間通訊

2022-09-07 07:57:11 字數 3486 閱讀 7537

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.程序控制 程序間通訊的...