欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2015年04月11日 11:38:42   投稿:junjie  
這篇文章主要介紹了Python進程通信之匿名管道實例講解,本文直接給出代碼實例,代碼中包含詳細(xì)注釋,需要的朋友可以參考下

匿名管道

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

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

復(fù)制代碼 代碼如下:

#!/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()


輸出如下:
復(fù)制代碼 代碼如下:

('hello from parent', 5053, 5054)
('hello from child', 5054)
how are you

how are you

how are you

how are you

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

復(fù)制代碼 代碼如下:

#!/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()

輸出如下:

復(fù)制代碼 代碼如下:

('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()實現(xiàn)輸出和輸入的重定向.spawn功能類似于subprocess.Popen(),既能發(fā)送消息給子進程,由能從子子進程獲取返回數(shù)據(jù).
復(fù)制代碼 代碼如下:

#!/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)#輸出流綁定到管道,發(fā)送到子進程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, 經(jīng)管道發(fā)送到子進程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代碼如下:

復(fù)制代碼 代碼如下:

#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()#從管道獲取數(shù)據(jù),來源于父經(jīng)常stdout
    time.sleep(3)
    send = 'Child %d got: [%s]' % (mypid, recv)
    print(send)#stdout綁定到管道上,發(fā)送到父進程stdin
    sys.stdout.flush()

輸出:

復(fù)制代碼 代碼如下:

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

相關(guān)文章

  • Pandas的數(shù)據(jù)過濾實現(xiàn)

    Pandas的數(shù)據(jù)過濾實現(xiàn)

    這篇文章主要介紹了Pandas的數(shù)據(jù)過濾實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • Pytorch可視化的幾種實現(xiàn)方法

    Pytorch可視化的幾種實現(xiàn)方法

    本文主要介紹了Pytorch可視化,主要介紹了3中使用方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • Python2.7環(huán)境Flask框架安裝簡明教程【已測試】

    Python2.7環(huán)境Flask框架安裝簡明教程【已測試】

    這篇文章主要介紹了Python2.7環(huán)境Flask框架安裝方法,結(jié)合實例形式詳細(xì)分析了Python2.7環(huán)境下安裝Flask框架遇到的問題與相關(guān)解決方法、注意事項,并給出了一個基本的測試示例,需要的朋友可以參考下
    2018-07-07
  • Python?isdigit()函數(shù)判斷字符串是否全都是數(shù)字字符示例

    Python?isdigit()函數(shù)判斷字符串是否全都是數(shù)字字符示例

    這篇文章主要為大家介紹了Python判斷字符串是否全都是數(shù)字字符示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2024-01-01
  • Python-openCV讀RGB通道圖實例

    Python-openCV讀RGB通道圖實例

    今天小編就為大家分享一篇Python-openCV讀RGB通道圖實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-01-01
  • Python字符串特性及常用字符串方法的簡單筆記

    Python字符串特性及常用字符串方法的簡單筆記

    這篇文章主要介紹了Python字符串特性及常見字符串方法的簡單筆記,為一些Pyhton入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2016-01-01
  • python3實現(xiàn)字符串操作的實例代碼

    python3實現(xiàn)字符串操作的實例代碼

    這篇文章主要介紹了python3實現(xiàn)字符串操作的實例代碼,需要的朋友可以參考下
    2019-04-04
  • 用Python?Turtle畫棵櫻花樹送給自己

    用Python?Turtle畫棵櫻花樹送給自己

    心情不好的時候,來用Python和Turtle庫畫棵櫻花樹送給自己吧,自己也要好好愛自己才對!文中的示例代碼講解詳細(xì),感興趣的小伙伴可以動手試一試
    2022-02-02
  • 開始著手第一個Django項目

    開始著手第一個Django項目

    這篇文章主要介紹了開始著手第一個Django項目的過程,Django是豐富多彩的Python框架中人氣最高的一個,功能多而全,需要的朋友可以參考下
    2015-07-07
  • Python實現(xiàn)在PyPI上發(fā)布自定義軟件包的方法詳解

    Python實現(xiàn)在PyPI上發(fā)布自定義軟件包的方法詳解

    在Python中我們經(jīng)常使用pip來安裝第三方Python軟件包,其實我們每個人都可以免費地將自己寫的Python包發(fā)布到PyPI上。本文我們就將詳細(xì)介紹如何發(fā)布測試包,需要的可以參考一下
    2022-06-06

最新評論