詳解Python進(jìn)程間通信之命名管道
管道是一種簡(jiǎn)單的FIFO通信信道,它是單向通信的。 通常啟動(dòng)進(jìn)程創(chuàng)建一個(gè)管道,然后這個(gè)進(jìn)程創(chuàng)建一個(gè)或者多個(gè)進(jìn)程子進(jìn)程接受管道信息,由于管道是單向通信,所以經(jīng)常需要?jiǎng)?chuàng)建兩個(gè)管道來(lái)實(shí)現(xiàn)雙向通信。
命名管道是對(duì)傳統(tǒng)管道的擴(kuò)展,默認(rèn)的管道是匿名管道,只在程序運(yùn)行時(shí)存在;而命名管道是持久化的,當(dāng)不需要時(shí)需要?jiǎng)h除它。
命名管道使用文件系統(tǒng),由mkfifo()方法創(chuàng)建。一旦創(chuàng)建了,兩個(gè)獨(dú)立的進(jìn)程都可以訪問(wèn)它,一個(gè)讀,另外一個(gè)寫。
命名管道支持阻塞讀和阻塞寫操作: 如果一個(gè)進(jìn)程打開文件讀,它會(huì)阻塞直到另外一個(gè)進(jìn)程寫。 但是我們可以指定O_NONBLOCK選項(xiàng)來(lái)啟用非阻塞模式。
命名管道必須以只讀或者只寫的模式打開,它不能以讀+寫的模式打開,因?yàn)樗鼤r(shí)單向通信。如果要實(shí)現(xiàn)雙向通信,必須打開兩個(gè)命名管道。
下面是一個(gè) Python 使用命名管道來(lái)實(shí)現(xiàn)進(jìn)程間通信的例子
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)
測(cè)試
- 首先運(yùn)行server.py
- 然后運(yùn)行client.py
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Opencv實(shí)現(xiàn)計(jì)算兩條直線或線段角度方法詳解
這篇文章主要介紹了Opencv實(shí)現(xiàn)計(jì)算兩條直線或線段角度方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧2022-12-12
python3.6實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了python3.6實(shí)現(xiàn)學(xué)生信息管理系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-02-02
flask數(shù)據(jù)庫(kù)序列化操作實(shí)例探究
這篇文章主要為大家介紹了flask數(shù)據(jù)庫(kù)序列化操作實(shí)例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01
Python DataFrame使用drop_duplicates()函數(shù)去重(保留重復(fù)值,取重復(fù)值)
這篇文章主要介紹了Python DataFrame使用drop_duplicates()函數(shù)去重(保留重復(fù)值,取重復(fù)值),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07
基于Python實(shí)現(xiàn)對(duì)PDF文件的OCR識(shí)別
大家可能聽說(shuō)過(guò)使用Python進(jìn)行OCR識(shí)別操作。在Python中,最出名的庫(kù)便是Google所資助的tesseract。利用tesseract可以很輕松地對(duì)圖像進(jìn)行識(shí)別。現(xiàn)在問(wèn)題來(lái)了,如果想對(duì)一個(gè)PDF文檔進(jìn)行OCR識(shí)別,該怎么做呢?下面一起來(lái)看看。2016-08-08
python wav模塊獲取采樣率 采樣點(diǎn)聲道量化位數(shù)(實(shí)例代碼)
這篇文章主要介紹了python wav模塊獲取采樣率 采樣點(diǎn)聲道量化位數(shù),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-01-01

