Python程序間通訊之命名管道
阿新 • • 發佈:2019-02-13
管道是一種簡單的FIFO通訊通道,它是單向通訊的。 通常啟動程序建立一個管道,然後這個程序建立一個或者多個程序子程序接受管道資訊,由於管道是單向通訊,所以經常需要建立兩個管道來實現雙向通訊。
命名管道是對傳統管道的擴充套件,預設的管道是匿名管道,只在程式執行時存在;而命名管道是持久化的,當不需要時需要刪除它。
命名管道使用檔案系統,由mkfifo()方法建立。一旦建立了,兩個獨立的程序都可以訪問它,一個讀,另外一個寫。
命名管道支援阻塞讀和阻塞寫操作: 如果一個程序開啟檔案讀,它會阻塞直到另外一個程序寫。 但是我們可以指定O_NONBLOCK選項來啟用非阻塞模式。
命名管道必須以只讀或者只寫的模式開啟,它不能以讀+寫的模式開啟,因為它時單向通訊。如果要實現雙向通訊,必須開啟兩個命名管道。
下面是一個 Python 使用命名管道來實現程序間通訊的例子
Server 端
import os, time
read_path = "/tmp/pipe.in"
write_path = "/tmp/pipe.out"
if os.path.exists(read_path):
os.remove(read_path)
if os.path.exists(write_path):
os.remove(write_path)
os.mkfifo(write_path)
os.mkfifo(read_path)
rf = os.open(read_path, os.O_RDONLY)
wf = os.open(write_path, os.O_SYNC | os.O_CREAT | os.O_RDWR)
while True:
s = os.read(rf, 1024)
print "received msg: %s" % s
if len(s) == 0:
time.sleep(1)
continue
if "exit" in s:
break
os.write(wf, s)
os.close(rf)
os.close(wf)
Client 端
import os
import time
write_path = "/tmp/pipe.in"
read_path = "/tmp/pipe.out"
wf = os.open(write_path, os.O_SYNC | os.O_CREAT | os.O_RDWR)
rf = None
for i in range(1, 11):
msg = "msg " + str(i)
len_send = os.write(wf, msg)
print "sent msg: %s" % msg
if rf is None:
rf = os.open(read_path, os.O_RDONLY)
s = os.read(rf, 1024)
if len(s) == 0:
break
print "received msg: %s" % s
time.sleep(1)
os.write(wf, 'exit')
os.close(rf)
os.close(wf)
測試
- 首先執行server.py
- 然後執行client.py