详解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命令行交互提示符的方法
Jan 14 Python
在Python中使用mongoengine操作MongoDB教程
Apr 24 Python
浅谈Python 集合(set)类型的操作——并交差
Jun 30 Python
node.js获取参数的常用方法(总结)
May 29 Python
对python多线程中互斥锁Threading.Lock的简单应用详解
Jan 11 Python
python中break、continue 、exit() 、pass终止循环的区别详解
Jul 08 Python
Django3.0 异步通信初体验(小结)
Dec 04 Python
python中的 zip函数详解及用法举例
Feb 16 Python
Python flask框架实现查询数据库并显示数据
Jun 04 Python
如何利用python发送邮件
Sep 26 Python
python使用selenium爬虫知乎的方法示例
Oct 28 Python
Python3利用openpyxl读写Excel文件的方法实例
Feb 03 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分页显示制作详细讲解
2008/11/19 PHP
PHP入门之常量简介和系统常量
2014/05/12 PHP
php的laravel框架快速集成微信登录的方法
2016/12/12 PHP
PHP实现基于回溯法求解迷宫问题的方法详解
2017/08/17 PHP
对php 判断http还是https,以及获得当前url的方法详解
2019/01/15 PHP
下载站控制介绍字数显示的脚本 显示全部 隐藏介绍等功能
2009/09/19 Javascript
JavaScript 学习笔记(七)字符串的连接
2009/12/31 Javascript
淘宝搜索框效果实现分析
2011/03/05 Javascript
常用Extjs工具:Extjs.util.Format使用方法
2012/03/22 Javascript
在Javascript中 声明时用"var"与不用"var"的区别
2013/04/15 Javascript
JS中FRAME的操作问题实例分析
2014/10/21 Javascript
javascript中Object使用详解
2015/01/26 Javascript
jQuery获取页面及个元素高度、宽度的总结——超实用
2015/07/28 Javascript
每天一篇javascript学习小结(Date对象)
2015/11/13 Javascript
完美JQuery图片切换效果的简单实现
2016/07/21 Javascript
js实现抽奖效果
2017/03/27 Javascript
微信小程序 动画的简单实例
2017/10/12 Javascript
js实现列表向上无限滚动
2020/01/13 Javascript
[51:14]LGD vs VP 2018国际邀请赛淘汰赛BO3 第一场 8.21
2018/08/22 DOTA
[31:55]完美世界DOTA2联赛循环赛 IO vs GXR BO2第一场 11.04
2020/11/05 DOTA
分享一下Python 开发者节省时间的10个方法
2015/10/02 Python
一个基于flask的web应用诞生 组织结构调整(7)
2017/04/11 Python
Python 正则表达式 re.match/re.search/re.sub的使用解析
2019/07/22 Python
Python 如何提高元组的可读性
2019/08/26 Python
Django 实现外键去除自动添加的后缀‘_id’
2019/11/15 Python
pytorch 获取tensor维度信息示例
2020/01/03 Python
HTML5学习笔记之html5与传统html区别
2016/01/06 HTML / CSS
公司庆典活动邀请函
2014/01/09 职场文书
大学运动会入场词
2014/02/22 职场文书
高等教育专业自荐信范文
2014/03/26 职场文书
《彩色世界》教学反思
2014/04/12 职场文书
改进作风怎么办发言材料
2014/08/17 职场文书
离婚协议书范本
2015/01/26 职场文书
MySQL分区表实现按月份归类
2021/11/01 MySQL
mysql中DCL常用的用户和权限控制
2022/03/31 MySQL
postgreSQL数据库基础知识介绍
2022/04/12 PostgreSQL