详解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 07 Python
深入解析Python中的WSGI接口
May 11 Python
python实现提取百度搜索结果的方法
May 19 Python
理解Python中的With语句
Mar 18 Python
Python安装第三方库及常见问题处理方法汇总
Sep 13 Python
python 接口_从协议到抽象基类详解
Aug 24 Python
python爬虫之urllib3的使用示例
Jul 09 Python
python矩阵的转置和逆转实例
Dec 12 Python
详解Python 字符串相似性的几种度量方法
Aug 29 Python
Python关键字及可变参数*args,**kw原理解析
Apr 04 Python
用Python进行websocket接口测试
Oct 16 Python
python读取pdf格式文档的实现代码
Apr 01 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中hashtable实现示例分享
2014/02/13 PHP
php判断电脑访问、手机访问的例子
2014/05/10 PHP
PHP实现抓取迅雷VIP账号的方法
2015/07/30 PHP
php将数组存储为文本文件方法汇总
2015/10/28 PHP
PHP的Yii框架中创建视图和渲染视图的方法详解
2016/03/29 PHP
JavaScript的模块化:封装(闭包),继承(原型) 介绍
2013/07/22 Javascript
jQuery中replaceWith()方法用法实例
2014/12/25 Javascript
jQuery实现360°全景拖动展示
2015/03/18 Javascript
JS实现的适合做faq或menu滑动效果示例
2016/11/17 Javascript
100多个基础常用JS函数和语法集合大全
2017/02/16 Javascript
JavaScript中splice与slice的区别
2017/05/09 Javascript
JavaScript制作简单的框选图表
2017/05/15 Javascript
js中less常用的方法小结
2017/08/09 Javascript
webpack组织模块打包Library的原理及实现
2018/03/10 Javascript
Python对小数进行除法运算的正确方法示例
2014/08/25 Python
Python的subprocess模块总结
2014/11/07 Python
Python+Wordpress制作小说站
2017/04/14 Python
Python序列对象与String类型内置方法详解
2019/10/22 Python
Django 自动生成api接口文档教程
2019/11/19 Python
pyhton中__pycache__文件夹的产生与作用详解
2019/11/24 Python
Python实现使用dir获取类的方法列表
2019/12/24 Python
python基于property()函数定义属性
2020/01/22 Python
Python如何把Spark数据写入ElasticSearch
2020/04/18 Python
python判断一个变量是否已经设置的方法
2020/08/13 Python
详解Java中一维、二维数组在内存中的结构
2021/02/11 Python
详解css3中dispaly的Grid布局与Flex布局
2020/09/11 HTML / CSS
伦敦时尚生活的缩影:LN-CC
2017/01/24 全球购物
阿迪达斯印度官方商城:adidas India
2017/03/26 全球购物
Myprotein荷兰官网:欧洲第一运动营养品牌
2020/07/11 全球购物
求最大连续递增数字串(如"ads3sl456789DF3456ld345AA"中的"456789")
2015/09/11 面试题
电子商务自荐书范文
2014/01/04 职场文书
《社戏》教学反思
2014/04/15 职场文书
《鸿门宴》教学反思
2014/04/22 职场文书
关于分班的感言
2015/08/04 职场文书
2016教师学习党章心得体会
2016/01/15 职场文书
python lambda 表达式形式分析
2022/04/03 Python