亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

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

系統 1775 0

匿名管道

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

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]"


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 久久久久蜜桃 | 亚洲精品久久久久中文字幕一区 | 亚洲 欧美 卡通 在线 另类 | 四虎精品福利视频精品 | 91亚色| 毛片在线不卡 | 一区二区三区在线 | 激情网站视频 | 亚洲综合久久久久久中文字幕 | 日韩欧美一区二区三区四区 | 一区二区三区四区免费视频 | 四虎国产精品永久地址99 | 999热视频 | 色91在线| 成人欧美一区二区三区黑人免费 | 中文字幕一区二区三区四区五区人 | 日日艹夜夜 | 91在线视频免费91 | 男人草女人的视频 | 爱操综合网 | 久久精品免费观看久久 | 天天狠狠弄夜夜狠狠躁·太爽了 | 欧美80岁老妇一级毛片 | 久久国产精品范冰啊 | 97在线公开视频 | 成人黄色片视频 | 国产一区中文字幕在线观看 | 国产精品高清一区二区三区 | 精品久久一 | 欧美成人免费全网站大片 | 欧美一级毛片aaa片 欧美一级毛片不卡免费观看 | 99精品在线播放 | 国产午夜精品不卡视频 | 四虎影院精品在线观看 | 精品久久一区二区三区 | 青草青视频在线观看 | 亚洲欧美日韩国产综合 | 国产精品视频免费一区二区三区 | 亚洲欧洲国产精品久久 | 久草精品在线观看 | 国模无水印一区二区三区 |