Python进程通信之匿名管道实例讲解
匿名管道 管道是一个单向通道,有点类似共享内存缓存.管道有两端,包括输入端和输出端.对于一个进程的而言,它只能看到管道一端,即要么是输入端要么是输出端. os.pipe()返回2个文件描述符(r,w),表示可读的和可写的.示例代码如下: 复制代码 代码如下: #!/usr/bin/python import time import os def child(wpipe): def parent(): 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): 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): parentStdin,childStdout = os.pipe() pid = os.fork() if __name__ == '__main__': print 'Hello 1 from parent',mypid #打印到输出流parentStdout,经管道发送到子进程childStdin print 'Hello 2 from parent',mypid pipetest.py代码如下: 复制代码 代码如下: #coding=utf-8 import os,time,sys mypid = os.getpid() for i in range(2): 输出: 复制代码 代码如下: 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]" (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |