详解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中黄金分割法实现方法
May 06 Python
浅析Python的Django框架中的Memcached
Jul 23 Python
Python中Selenium模拟JQuery滑动解锁实例
Jul 26 Python
Python微信公众号开发平台
Jan 25 Python
详解Python3注释知识点
Feb 19 Python
python格式化输出保留2位小数的实现方法
Jul 02 Python
手把手教你进行Python虚拟环境配置教程
Feb 03 Python
Python图像处理库PIL中图像格式转换的实现
Feb 26 Python
Python实现在Windows平台修改文件属性
Mar 05 Python
关于python 的legend图例,参数使用说明
Apr 17 Python
Python中格式化字符串的四种实现
May 26 Python
python 使用pandas读取csv文件的方法
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中比较简单的导入phpmyadmin生成的sql文件的方法
2011/06/28 PHP
基于MySQL体系结构的分析
2013/05/02 PHP
windows的文件系统机制引发的PHP路径爆破问题分析
2014/07/28 PHP
CI(Codeigniter)的Setting增强配置类实例
2016/01/06 PHP
thinkPHP多域名情况下使用memcache方式共享session数据的实现方法
2016/07/21 PHP
php微信开发之关键词回复功能
2018/06/13 PHP
传智播客学习之java 反射
2009/11/22 Javascript
最新28个很棒的jQuery 教程
2011/05/28 Javascript
通过Javascript将数据导出到外部Excel文档的函数代码
2012/06/15 Javascript
JS中for循序中延迟加载动态效果的具体实现
2013/08/18 Javascript
JavaScript实现文字与图片拖拽效果的方法
2015/02/16 Javascript
javascript动态添加checkbox复选框的方法
2015/12/23 Javascript
AngularJS基础 ng-repeat 指令简单示例
2016/08/03 Javascript
Web前端框架Angular4.0.0 正式版发布
2017/03/28 Javascript
ES6实现的遍历目录函数示例
2017/04/07 Javascript
浅谈Angular路由守卫
2017/08/26 Javascript
微信禁止下拉查看URL的处理方法
2017/09/28 Javascript
nodejs操作mongodb的增删改查功能实例
2017/11/09 NodeJs
解决vue 单文件组件中样式加载问题
2019/04/24 Javascript
WEEX环境搭建与入门详解
2019/10/16 Javascript
详解微信小程序入门从这里出发(登录注册、开发工具、文件及结构介绍)
2020/07/21 Javascript
Python常用列表数据结构小结
2014/08/06 Python
Python判断字符串是否为字母或者数字(浮点数)的多种方法
2018/08/03 Python
Django model序列化为json的方法示例
2018/10/16 Python
django admin后台添加导出excel功能示例代码
2019/05/15 Python
Flask框架重定向,错误显示,Responses响应及Sessions会话操作示例
2019/08/01 Python
Pytorch中膨胀卷积的用法详解
2020/01/07 Python
解决matplotlib.pyplot在Jupyter notebook中不显示图像问题
2020/04/22 Python
C&A巴西网上商店:时尚、衣服、手机和鞋子
2020/06/07 全球购物
科研先进个人典型材料
2014/01/31 职场文书
创先争优演讲稿
2014/09/15 职场文书
领导班子三严三实心得体会
2014/10/13 职场文书
2015年幼儿园安全工作总结
2015/05/12 职场文书
MySQL之select、distinct、limit的使用
2021/11/11 MySQL
Golang jwt身份认证
2022/04/20 Golang
python数字图像处理:图像简单滤波
2022/06/28 Python