详解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实现目录树生成示例
Mar 28 Python
Python中实现参数类型检查的简单方法
Apr 21 Python
使用Python来编写HTTP服务器的超级指南
Feb 18 Python
Django安装配置mysql的方法步骤
Oct 15 Python
Python3实现腾讯云OCR识别
Nov 27 Python
python_opencv用线段画封闭矩形的实例
Dec 05 Python
对python指数、幂数拟合curve_fit详解
Dec 29 Python
python中metaclass原理与用法详解
Jun 25 Python
简单了解python中的与或非运算
Sep 18 Python
Django中自定义模型管理器(Manager)及方法
Sep 23 Python
Keras搭建自编码器操作
Jul 03 Python
Python 使用Opencv实现目标检测与识别的示例代码
Sep 08 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
超神学院:鹤熙已踏入神圣领域,实力不比凯莎弱
2020/03/02 国漫
php生成图片验证码
2015/06/09 PHP
php中ob函数缓冲机制深入理解
2015/08/03 PHP
PHP异常处理定义与使用方法分析
2017/07/25 PHP
理解JavaScript变量作用域更轻松
2009/10/25 Javascript
初试jQuery EasyUI 使用介绍
2010/04/01 Javascript
基于jquery实现省市联动效果
2015/11/23 Javascript
360doc网站不登录就无法复制内容的解决方法
2018/01/27 Javascript
vue filters的使用详解
2018/06/11 Javascript
layDate日期控件使用方法详解
2018/11/15 Javascript
JavaScript实现图片放大镜效果
2019/06/27 Javascript
基于JavaScript伪随机正态分布代码实例
2019/11/07 Javascript
Vue2.0 实现页面缓存和不缓存的方式
2019/11/12 Javascript
JavaScript实现简单的图片切换功能(实例代码)
2020/04/10 Javascript
Vue项目前后端联调(使用proxyTable实现跨域方式)
2020/07/18 Javascript
详解JavaScript 的执行机制
2020/09/18 Javascript
JavaScript实现手风琴效果
2021/02/18 Javascript
python中字典(Dictionary)用法实例详解
2015/05/30 Python
python八大排序算法速度实例对比
2017/12/06 Python
Selenium chrome配置代理Python版的方法
2018/11/29 Python
对Python正则匹配IP、Url、Mail的方法详解
2018/12/25 Python
python openCV获取人脸部分并存储功能
2019/08/28 Python
使用OpCode绕过Python沙箱的方法详解
2019/09/03 Python
Python timer定时器两种常用方法解析
2020/01/20 Python
Python找出列表中出现次数最多的元素三种方式
2020/02/24 Python
使用Python开发个京东上抢口罩的小实例(仅作技术研究学习使用)
2020/03/10 Python
python使用re模块爬取豆瓣Top250电影
2020/10/20 Python
python实现文件分片上传的接口自动化
2020/11/19 Python
Matplotlib中rcParams使用方法
2021/01/05 Python
Pretty Little Thing爱尔兰:时尚女性服饰
2017/03/27 全球购物
Charles & Colvard官网:美国莫桑石品牌
2019/06/05 全球购物
英国名牌服装购物网站:OD’s Designer
2019/09/02 全球购物
Hotels.com越南:酒店预订
2019/10/29 全球购物
写给媳妇的检讨书
2015/05/06 职场文书
2015年人民调解工作总结
2015/05/18 职场文书
从原生JavaScript到React深入理解
2022/07/23 Javascript