详解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中类和实例如何绑定属性与方法示例详解
Aug 18 Python
Python利用Django如何写restful api接口详解
Jun 08 Python
解决python读取几千万行的大表内存问题
Jun 26 Python
python实现12306登录并保存cookie的方法示例
Dec 17 Python
python装饰器代替set get方法实例
Dec 19 Python
使用PyTorch实现MNIST手写体识别代码
Jan 18 Python
python下载卫星云图合成gif的方法示例
Feb 18 Python
pytorch下的unsqueeze和squeeze的用法说明
Feb 06 Python
Python LMDB库的使用示例
Feb 14 Python
Python基础之赋值,浅拷贝,深拷贝的区别
Apr 30 Python
Django实现drf搜索过滤和排序过滤
Jun 21 Python
Python TypeError: ‘float‘ object is not subscriptable错误解决
Dec 24 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应用提速面面观
2006/10/09 PHP
通过ODBC连接的SQL SERVER实例
2006/10/09 PHP
PHP中static关键字原理的学习研究分析
2011/07/18 PHP
PHP中的use关键字概述
2014/07/23 PHP
swoole_process实现进程池的方法示例
2018/10/29 PHP
原来Jquery.load的方法可以一直load下去
2011/03/28 Javascript
jQuery Ajax 实例全解析
2011/04/20 Javascript
jquery select动态加载选择(兼容各种浏览器)
2013/02/01 Javascript
Jquery 获取指定标签的对象及属性的设置与移除
2014/05/29 Javascript
JavaScript支持的最大递归调用次数分析
2014/06/24 Javascript
JsRender for index循环索引用法详解
2014/10/31 Javascript
深入浅析react native es6语法
2015/12/09 Javascript
详解Vue2.0里过滤器容易踩到的坑
2017/06/01 Javascript
node.js+express+mySQL+ejs+bootstrop实现网站登录注册功能
2018/01/12 Javascript
vuejs简单验证码功能完整示例
2019/01/08 Javascript
面试题:react和vue的区别分析
2019/04/08 Javascript
前端Vue项目详解--初始化及导航栏
2019/06/24 Javascript
JavaScript实现拖拽和缩放效果
2020/08/24 Javascript
vant-ui框架的一个bug(解决切换后onload不触发)
2020/11/11 Javascript
pycharm 使用心得(八)如何调用另一文件中的函数
2014/06/06 Python
python通过colorama模块在控制台输出彩色文字的方法
2015/03/19 Python
Python中函数的多种格式和使用实例及小技巧
2015/04/13 Python
Swift中的协议(protocol)学习教程
2016/07/08 Python
Django中redis的使用方法(包括安装、配置、启动)
2018/02/21 Python
Python 旋转打印各种矩形的方法
2019/07/09 Python
python cv2在验证码识别中应用实例解析
2019/12/25 Python
python 画图 图例自由定义方式
2020/04/17 Python
matlab、python中矩阵的互相导入导出方式
2020/06/01 Python
澳洲本土太阳镜品牌:Quay Australia
2019/07/29 全球购物
西雅图的买手店:Totokaelo
2019/10/19 全球购物
批评与自我批评材料
2014/02/15 职场文书
防卫过当辩护词
2015/05/21 职场文书
CAD实训总结范文
2015/08/03 职场文书
测量JavaScript函数的性能各种方式对比
2021/04/27 Javascript
python中24小时制转换为12小时制的方法
2021/06/18 Python
Vue如何清空对象
2022/03/03 Vue.js