详解Python进程间通信之命名管道


Posted in Python onAugust 28, 2017

管道是一种简单的FIFO通信信道,它是单向通信的。 通常启动进程创建一个管道,然后这个进程创建一个或者多个进程子进程接受管道信息,由于管道是单向通信,所以经常需要创建两个管道来实现双向通信。

命名管道是对传统管道的扩展,默认的管道是匿名管道,只在程序运行时存在;而命名管道是持久化的,当不需要时需要删除它。

命名管道使用文件系统,由mkfifo()方法创建。一旦创建了,两个独立的进程都可以访问它,一个读,另外一个写。

命名管道支持阻塞读和阻塞写操作: 如果一个进程打开文件读,它会阻塞直到另外一个进程写。 但是我们可以指定O_NONBLOCK选项来启用非阻塞模式。

命名管道必须以只读或者只写的模式打开,它不能以读+写的模式打开,因为它时单向通信。如果要实现双向通信,必须打开两个命名管道。

下面是一个 Python 使用命名管道来实现进程间通信的例子

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)

测试

  • 首先运行server.py
  • 然后运行client.py

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
用Python操作字符串之rindex()方法的使用
May 19 Python
python代码 if not x: 和 if x is not None: 和 if not x is None:使用介绍
Sep 21 Python
Python实现自动发送邮件功能
Mar 02 Python
python脚本作为Windows服务启动代码详解
Feb 11 Python
Python selenium抓取微博内容的示例代码
May 17 Python
详解Python数据分析--Pandas知识点
Mar 23 Python
python3实现字符串操作的实例代码
Apr 16 Python
django认证系统 Authentication使用详解
Jul 22 Python
django foreignkey外键使用的例子 相当于left join
Aug 06 Python
Python namedtuple命名元组实现过程解析
Jan 08 Python
Python统计文本词汇出现次数的实例代码
Feb 27 Python
python使用ctypes库调用DLL动态链接库
Oct 22 Python
基于Python闭包及其作用域详解
Aug 28 #Python
利用Python查看目录中的文件示例详解
Aug 28 #Python
Python如何通过subprocess调用adb命令详解
Aug 27 #Python
Python中序列的修改、散列与切片详解
Aug 27 #Python
Python正确重载运算符的方法示例详解
Aug 27 #Python
深入学习Python中的上下文管理器与else块
Aug 27 #Python
python利用MethodType绑定方法到类示例代码
Aug 27 #Python
You might like
PHP中使用SimpleXML检查XML文件结构实例
2015/01/07 PHP
PHP验证终端类型是否为手机的简单实例
2017/02/07 PHP
php实现推荐功能的简单实例
2019/09/29 PHP
理解Javascript_02_理解undefined和null
2010/10/11 Javascript
JavaScript 学习笔记之一jQuery写法图片等比缩放以及预加载
2012/06/28 Javascript
求数组最大最小值方法适用于任何数组
2013/08/16 Javascript
JQuery的$和其它JS发生冲突的快速解决方法
2014/01/24 Javascript
JavaScript中的console.dir()函数介绍
2014/12/29 Javascript
jQuery实现的多屏图像图层切换效果实例
2015/05/07 Javascript
javascript实现输出指定行数正方形图案的方法
2015/08/03 Javascript
js判断子窗体是否关闭的方法
2015/08/11 Javascript
微信公众号-获取用户信息(网页授权获取)实现步骤
2016/10/21 Javascript
js基础之DOM中document对象的常用属性方法详解
2016/10/28 Javascript
Bootstrap基本插件学习笔记之模态对话框(16)
2016/12/08 Javascript
jQuery实现优雅的弹窗效果(6)
2017/02/08 Javascript
很棒的vue弹窗组件
2017/05/24 Javascript
基于DOM节点删除之empty和remove的区别(详解)
2017/09/11 Javascript
利用jQuery实现简单的拖曳效果实例代码
2017/10/20 jQuery
深入理解JavaScript 中的执行上下文和执行栈
2018/10/23 Javascript
vue实现的微信机器人聊天功能案例【附源码下载】
2019/02/18 Javascript
vue循环数组改变点击文字的颜色
2019/10/14 Javascript
nodejs对mongodb数据库的增加修删该查实例代码
2020/01/05 NodeJs
Python中利用Scipy包的SIFT方法进行图片识别的实例教程
2016/06/03 Python
Python中asyncore异步模块的用法及实现httpclient的实例
2016/06/28 Python
python3实现爬取淘宝美食代码分享
2018/09/23 Python
python初学者,用python实现基本的学生管理系统(python3)代码实例
2019/04/10 Python
在pytorch中查看可训练参数的例子
2019/08/18 Python
原生python实现knn分类算法
2019/10/24 Python
python实现PCA降维的示例详解
2020/02/24 Python
解决virtualenv -p python3 venv报错的问题
2021/02/05 Python
html5 Web SQL Database 之事务处理函数transaction与executeSQL解析
2013/11/07 HTML / CSS
THE OUTNET美国官网:国际设计师品牌折扣网站
2017/03/07 全球购物
家长会开场白和结束语
2015/05/29 职场文书
Nginx + consul + upsync 完成动态负载均衡的方法详解
2021/03/31 Servers
Spring中的使用@Async异步调用方法
2021/11/01 Java/Android
html原生table实现合并单元格以及合并表头的示例代码
2023/05/07 HTML / CSS