python管道通信_Python進程通信之匿名管道實例講解

匿名管道

管道是一個單向通道,有點類似共享內存緩存.管道有兩端,包括輸入端和輸出端.對于一個進程的而言,它只能看到管道一端,即要么是輸入端要么是輸出端.

os.pipe()返回2個文件描述符(r, w),表示可讀的和可寫的.示例代碼如下:

復制代碼 代碼如下:

#!/usr/bin/python

import time

import os

def child(wpipe):

print('hello from child', os.getpid())

while True:

msg = 'how are you\n'.encode()

os.write(wpipe, msg)

time.sleep(1)

def parent():

rpipe, wpipe = os.pipe()

pid = os.fork()

if pid == 0:

child(wpipe)

assert False, 'fork child process error!'

else:

os.close(wpipe)

print('hello from parent', os.getpid(), pid)

fobj = os.fdopen(rpipe, 'r')

while True:

recv = os.read(rpipe, 32)

print recv

parent()

輸出如下:

復制代碼 代碼如下:

('hello from parent', 5053, 5054)

('hello from child', 5054)

how are you

how are you

how are you

how are you

我們也可以改進代碼,不用os.read()從管道中讀取二進制字節,而是從文件對象中讀取字符串.這時需要用到os.fdopen()把底層的文件描述符(管道)包裝成文件對象,然后再用文件對象中的readline()方法讀取.這里請注意文件對象的readline()方法總是讀取有換行符'\n'的一行,而且連換行符也讀取出來.還有一點要改進的地方是,把父進程和子進程的管道中不用的一端關閉掉.

復制代碼 代碼如下:

#!/usr/bin/python

import time

import os

def child(wpipe):

print('hello from child', os.getpid())

while True:

msg = 'how are you\n'.encode()

os.write(wpipe, msg)

time.sleep(1)

def parent():

rpipe, wpipe = os.pipe()

pid = os.fork()

if pid == 0:

os.close(rpipe)

child(wpipe)

assert False, 'fork child process error!'

else:

os.close(wpipe)

print('hello from parent', os.getpid(), pid)

fobj = os.fdopen(rpipe, 'r')

while True:

recv = fobj.readline()[:-1]

print recv

parent()

輸出如下:

復制代碼 代碼如下:

('hello from parent', 5108, 5109)

('hello from child', 5109)

how are you

how are you

how are you

如果要與子進程進行雙向通信,只有一個pipe管道是不夠的,需要2個pipe管道才行.以下示例在父進程新建了2個管道,然后再fork子進程.os.dup2()實現輸出和輸入的重定向.spawn功能類似于subprocess.Popen(),既能發送消息給子進程,由能從子子進程獲取返回數據.

復制代碼 代碼如下:

#!/usr/bin/python

#coding=utf-8

import os, sys

def spawn(prog, *args):

stdinFd = sys.stdin.fileno()

stdoutFd = sys.stdout.fileno()

parentStdin, childStdout = os.pipe()

childStdin, parentStdout= os.pipe()

pid = os.fork()

if pid:

os.close(childStdin)

os.close(childStdout)

os.dup2(parentStdin, stdinFd)#輸入流綁定到管道,將輸入重定向到管道一端parentStdin

os.dup2(parentStdout, stdoutFd)#輸出流綁定到管道,發送到子進程childStdin

else:

os.close(parentStdin)

os.close(parentStdout)

os.dup2(childStdin, stdinFd)#輸入流綁定到管道

os.dup2(childStdout, stdoutFd)

args = (prog, ) + args

os.execvp(prog, args)

assert False, 'execvp failed!'

if __name__ == '__main__':

mypid = os.getpid()

spawn('python', 'pipetest.py', 'spam')

print 'Hello 1 from parent', mypid #打印到輸出流parentStdout, 經管道發送到子進程childStdin

sys.stdout.flush()

reply = raw_input()

sys.stderr.write('Parent got: "%s"\n' % reply)#stderr沒有綁定到管道上

print 'Hello 2 from parent', mypid

sys.stdout.flush()

reply = sys.stdin.readline()#另外一種方式獲得子進程返回信息

sys.stderr.write('Parent got: "%s"\n' % reply[:-1])

pipetest.py代碼如下:

復制代碼 代碼如下:

#coding=utf-8

import os, time, sys

mypid = os.getpid()

parentpid = os.getppid()

sys.stderr.write('child %d of %d got arg: "%s"\n' %(mypid, parentpid, sys.argv[1]))

for i in range(2):

time.sleep(3)

recv = raw_input()#從管道獲取數據,來源于父經常stdout

time.sleep(3)

send = 'Child %d got: [%s]' % (mypid, recv)

print(send)#stdout綁定到管道上,發送到父進程stdin

sys.stdout.flush()

輸出:

復制代碼 代碼如下:

child 7265 of 7264 got arg: "spam"

Parent got: "Child 7265 got: [Hello 1 from parent 7264]"

Parent got: "Child 7265 got: [Hello 2 from parent 7264]"

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/369967.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/369967.shtml
英文地址,請注明出處:http://en.pswp.cn/news/369967.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

css3中的box-sizing屬性的使用

box-sizing屬性用來定義元素的width和height所表示的區域,該屬性一般有三種值:content-box、border-box、inherit。 其中inherit表示box-sizing的值應該從父元素繼承。 content-box和border-box的主要區別就是元素的width和height的值包不包括border、padding這兩…

ES6擴展運算符...進行的數組刪除

今天寫了按照React小書寫了Reducer,發現基礎真是太重要了,所有關于上層建筑的細節都需要回到下層細節中去尋找,而且現在的基礎也由ES3變成了ES6了。 const ADD_USER "ADD_USER" const DELETE_USER "DELETE_USER" const…

中南大學在線考試答案計算機基礎,中南大學《計算機基礎》在線考試題庫(267題)(有答案).doc...

中南大學《計算機基礎》在線考試題庫(267題)(有答案).doc 計算機基礎01 總共89題共100分 一. 單選題 (共35題,共35分) 1. 域名服務器DNS的主要功能是( )。 (1分) A.通過請求及回答獲取主機和網絡相關的信息 B.查詢主機的MAC地址 C.為主機自動命名 D.合理分配IP地址 ★標準答案&…

自動化的OSGi測試運行器

在我的團隊成員中,我以忘記維護(JUnit)測試套件而聞名。 我只是無法為此付出額外的手動為套件添加測試的步驟。 幸運的是,有連續的集成服務器通過命名模式收集測試。 如果我介紹的一項孤立測試失敗了,那么它會脫穎而出…

php post請求后端拿不到值_PHP Post獲取不到非表單數據的問題解決辦法

問題描述在使用vue-axios向后端post數據時,PHP端獲取不到post的數據。問題解決修改php.ini配置找到php.ini配置文件,查找enable_post_data_reading變量,修改為打開狀態,注釋掉句前分好; Whether PHP will read the POST data.; Th…

CSS制作簡單loading動畫

曾經以為,loading的制作需要一些比較高深的web動畫技術,后來發現大多數loading都可以用“障眼法”做出來。比如一個旋轉的圓圈,并不都是將gif圖放進去,有些就是畫個靜止圖像,然后讓它旋轉就完了。gif圖也可以&#xff…

機器學習:多變量線性回歸

************************************** 注:本系列博客是博主學習Stanford大學 Andrew Ng 教授的《機器學習》課程筆記。博主深感學過課程后,不進行總結非常easy遺忘,依據課程加上自己對不明確問題的補充遂有此系列博客。本系列博客包含線性…

Java對象復活

總覽 收集覆蓋了finalize()的對象之后,將其添加到終結處理隊列中,以在調用每個對象的finalize()方法之后進行清理。 如果您復活該物體,會發生什么? 何時定稿? finalize方…

經過路由無法找到計算機,電腦無法啟動服務提示系統找不到指定的路徑(圖)

原標題:"電腦無法啟動服務提示系統找不到指定的路徑"相關電腦問題教程分享。 - 來源:191路由網。眾所周知,使用電腦的時候需要啟動一些服務才能使用相關的功能,但是如果出現無法啟動服務項,并且提示“錯誤3:…

有關域索引錯誤產生的原因及解決辦法

1說明 數據庫錯誤ORA-29861:域索引標記為LOADING/FAILED/UNUSABLE,其錯誤原因及解決辦法,根據ORACLE官方文檔的說法如下: // *Cause: An attempt has been made to access a domain index that is// being built or is marked faile…

詳細解讀css中的浮動以及清除浮動的方法

對于前端初學者來說,css浮動部分的知識是一塊比較難以理解的部分,下面我將把我學習過程中的心得分享給大家。 導讀: 1.css塊級元素講解 2.css中浮動是如何產生的 3.出現浮動后,如何清除浮動(本文將涉及到多種清除浮動…

微信多開txt_電腦版微信怎么雙開、多開

新建一個txt文本文件,在文件中寫入如下代碼:echo offstart /d "C:\Program Files (x86)\Tencent\WeChat\" WeChat.exestart /d "C:\Program Files (x86)\Tencent\WeChat\" WeChat.exeexit保存文本文件。這里需要注意的是&#xff1a…

java 基礎--隨筆

---恢復內容開始--- java 對大小寫敏感。 java沒有任何無符號類型(unsigned)。 C/C是編譯型語言,java是解釋性語言。 JAVA編譯過程同C/C 的 編譯有些不同。當C編譯器編譯生成一個對象的代碼時,該代碼是為在某一特定硬件平臺運行而…

多源計算機培訓,多源數據匯聚的多流形學習算法研究

摘要:隨著信息技術和互聯網的飛速發展,人們可以從多個信息源獲得數據,即多源數據.由于多源數據具有類型多樣,尺度不統一等特點,對多源數據進行匯聚并提取有效信息是機器學習和模式識別等領域研究的熱點.由于多流形學習能夠有效地揭示復雜數據中的內在結構,因此本文主…

Ubuntu 16.04 安裝mysql5.7

技術更新換代,數據庫也不斷更新,需要不斷努力學習,下面就是如何在 ubuntu中安裝 mysql。 廢話不多說,上來就是干 一、安裝mysql 5.7 sudo apt-get update sudo apt-get install mysql-server 中間會提示您輸出root 密碼&#xff…

CSS多列布局(實例)

前言 一列布局二列布局三列布局 1 一列布局 一列布局&#xff1a; HTML部分 <!DOCTYPE html> <html> <head> <meta charset"utf-8" /> <title>一列布局</title> </head> <body> <div class"head">…

阿帕奇駱駝備忘單

輪詢一個空目錄&#xff08;并發送一個空消息&#xff0c;正文為空&#xff09;&#xff1a; from(file://temp?sendEmptyMessageWhenIdletrue)停止路線&#xff1a; .process(new Processor() {public void process(Exchange exchange) throws Exception {getContext().stopR…

js中雙感嘆號_JavaScript中雙嘆號(!!)作用

經常看到這樣的例子&#xff1a;vara&#xff1b;var b!!a;a默認是undefined。!a是true&#xff0c;!!a則是false&#xff0c;所以b的值是false&#xff0c;而不再是undefined&#xff0c;也非其它值&#xff0c;主要是為后續判斷提供便利。!!一般用來將后面的表達式強制轉換為…

大頭貼計算機教程,推薦!自家電腦也能拍大頭貼的秘密

您可能感興趣的話題&#xff1a;美圖拍拍核心提示&#xff1a;一直都超愛拍大頭貼&#xff0c;喜歡每張都能換不同的框框&#xff1b;喜歡可以直接看到效果&#xff0c;做出滿意的動作&#xff1b;喜歡將大頭貼和朋友們分享……不過夏日炎炎的&#xff0c;出門太麻煩&#xff0…

用CSS偽類制作一個不斷旋轉的八卦圖?

前言 介紹一下如何制作一個不斷旋轉的八卦圖。快速預覽代碼及效果&#xff0c;點擊&#xff1a;八卦圖 代碼如下&#xff1a; HTML部分 <!DOCTYPE html> <html> <head><meta charset"utf-8"><title>JS Bin</title> </head&…