详解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实现字典去除重复的方法示例
Jul 31 Python
Python 由字符串函数名得到对应的函数(实例讲解)
Aug 10 Python
python使用正则表达式的search()函数实现指定位置搜索功能
Nov 10 Python
python模块smtplib学习
May 22 Python
Flask框架实现给视图函数增加装饰器操作示例
Jul 16 Python
django session完成状态保持的方法
Nov 27 Python
python之Flask实现简单登录功能的示例代码
Dec 24 Python
python爬取内容存入Excel实例
Feb 20 Python
django 使用全局搜索功能的实例详解
Jul 18 Python
centos7之Python3.74安装教程
Aug 15 Python
Python实现敏感词过滤的4种方法
Sep 12 Python
python 如何将office文件转换为PDF
Sep 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
Discuz!5的PHP代码高亮显示插件(黑暗中的舞者更新)
2007/01/29 PHP
PHP 二维数组和三维数组的过滤
2016/03/16 PHP
jquery 新手学习常见问题解决方法
2010/04/18 Javascript
javascript中的变量作用域以及变量提升详细介绍
2013/10/24 Javascript
浅谈Javascript中深复制
2014/12/01 Javascript
JavaScript实现的多种鼠标拖放效果
2015/11/03 Javascript
简单实现限制uploadify上传个数
2015/11/16 Javascript
JavaScript对象封装的简单实现方法(3种方法)
2017/01/03 Javascript
js制作可以延时消失的菜单
2017/01/13 Javascript
JS随机排序数组实现方法分析
2017/10/11 Javascript
Three.js基础学习教程
2017/11/16 Javascript
JavaScript中严格判断NaN的方法
2018/02/16 Javascript
Python的Flask框架及Nginx实现静态文件访问限制功能
2016/06/27 Python
Python实现快速计算词频功能示例
2018/06/25 Python
python 获取键盘输入,同时有超时的功能示例
2018/11/13 Python
matplotlib.pyplot绘图显示控制方法
2019/01/15 Python
python中yield的用法详解——最简单,最清晰的解释
2019/04/04 Python
Python利用pandas处理Excel数据的应用详解
2019/06/18 Python
python中的逆序遍历实例
2019/12/25 Python
MoviePy常用剪辑类及Python视频剪辑自动化
2020/12/18 Python
在IE6系列等老式浏览器中使用HTML5的新标签实现方案
2012/12/25 HTML / CSS
暇步士官网:Hush Puppies
2016/09/22 全球购物
联想中国官方商城:Lenovo China
2017/10/18 全球购物
Reebok官方旗舰店:美国知名健身品牌锐步
2019/01/07 全球购物
如何找出EMP表里面SALARY第N高的employee
2013/12/05 面试题
汽车专业人才自我鉴定范文
2013/12/29 职场文书
面临毕业的毕业生自荐书范文
2014/02/05 职场文书
科长竞争上岗演讲稿
2014/05/12 职场文书
新手上路标语
2014/06/20 职场文书
应届生面试求职信
2014/07/02 职场文书
2014机关干部学习“焦裕禄精神”思想汇报
2014/09/19 职场文书
一份没有按时交货失信于客户的检讨书
2014/09/19 职场文书
农业生产宣传标语
2014/10/08 职场文书
范文之农村基层党建工作报告
2019/10/24 职场文书
MySQL 四种连接和多表查询详解
2021/07/16 MySQL
nginx.conf配置文件结构小结
2022/04/08 Servers