详解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的SQLAlchemy框架使用入门
Apr 29 Python
Python使用tablib生成excel文件的简单实现方法
Mar 16 Python
Python字典,函数,全局变量代码解析
Dec 18 Python
Python实现批量读取图片并存入mongodb数据库的方法示例
Apr 02 Python
python如何获取列表中每个元素的下标位置
Jul 01 Python
Python生命游戏实现原理及过程解析(附源代码)
Aug 01 Python
Python 调用 Windows API COM 新法
Aug 22 Python
使用Python测试Ping主机IP和某端口是否开放的实例
Dec 17 Python
python shutil文件操作工具使用实例分析
Dec 25 Python
在python中利用dict转json按输入顺序输出内容方式
Feb 27 Python
关于Python错误重试方法总结
Jan 03 Python
在pyCharm中下载第三方库的方法
Apr 18 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 数组遍历方法大全(foreach,list,each)
2010/06/30 PHP
php发送post请求的三种方法
2014/02/11 PHP
php简单实现多语言切换的方法
2016/05/09 PHP
js下弹出窗口的变通
2007/04/18 Javascript
JavaScript词法作用域与调用对象深入理解
2012/11/29 Javascript
使用delegate方法为一个tr标签加一个链接
2014/06/27 Javascript
JS实现动态增加和删除li标签行的实例代码
2016/10/16 Javascript
BootStrap tab选项卡使用小结
2020/08/09 Javascript
JS中IP地址与整数相互转换的实现代码
2017/04/10 Javascript
JavaScript 处理树数据结构的方法示例
2019/06/16 Javascript
用js编写留言板
2020/03/17 Javascript
VSCode搭建React Native环境
2020/05/07 Javascript
解决Vue + Echarts 使用markLine标线(precision精度问题)
2020/07/20 Javascript
vue axios封装httpjs,接口公用配置拦截操作
2020/08/11 Javascript
python去掉字符串中重复字符的方法
2014/02/27 Python
Python的SQLAlchemy框架使用入门
2015/04/29 Python
python插入排序算法实例分析
2015/07/03 Python
Python过滤列表用法实例分析
2016/04/29 Python
django反向解析和正向解析的方式
2018/06/05 Python
Python 类的特殊成员解析
2018/06/20 Python
使用Python调取任意数字资产钱包余额功能
2019/08/15 Python
python 协程 gevent原理与用法分析
2019/11/22 Python
Python 余弦相似度与皮尔逊相关系数 计算实例
2019/12/23 Python
python3判断IP地址的方法
2021/03/04 Python
使用CSS3配合IE滤镜实现渐变和投影的效果
2015/09/06 HTML / CSS
详解如何使用rem或viewport进行移动端适配
2020/08/14 HTML / CSS
REISS美国官网:伦敦最受欢迎的时尚品牌
2019/08/16 全球购物
如何提高JDBC的性能
2013/04/30 面试题
介绍一下sql server的安全性
2014/08/10 面试题
政法大学毕业生自荐信范文
2014/01/01 职场文书
竞聘副主任科员演讲稿
2014/01/11 职场文书
总经理任命书
2014/03/29 职场文书
出纳工作检讨书范文
2014/12/27 职场文书
2015年电话客服工作总结
2015/05/18 职场文书
十个Python自动化常用操作,即拿即用
2021/05/10 Python
手把手教你实现PyTorch的MNIST数据集
2021/06/28 Python