详解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 相关文章推荐
利用打码兔和超人打码自封装的打码类分享
Mar 16 Python
Python中的super()方法使用简介
Aug 14 Python
python安装PIL模块时Unable to find vcvarsall.bat错误的解决方法
Sep 19 Python
python的变量与赋值详细分析
Nov 08 Python
python实现TF-IDF算法解析
Jan 02 Python
基于numpy.random.randn()与rand()的区别详解
Apr 17 Python
Python绘制3D图形
May 03 Python
python将处理好的图像保存到指定目录下的方法
Jan 10 Python
解决python中画图时x,y轴名称出现中文乱码的问题
Jan 29 Python
Pandas删除数据的几种情况(小结)
Jun 21 Python
Pycharm中使用git进行合作开发的教程详解
Nov 17 Python
用Python写一个简易版弹球游戏
Apr 13 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中对数据库操作的封装
2006/10/09 PHP
《PHP编程最快明白》第六讲:Mysql数据库操作
2010/11/01 PHP
php数组去重实例及分析
2013/11/26 PHP
PHP实现服务器状态监控的方法
2014/12/09 PHP
巧妙破除网页右键禁用的十大绝招
2006/08/12 Javascript
基于jQuery制作迷你背词汇工具
2010/07/27 Javascript
jQuery 遍历- 关于closest() 的方法介绍以及与parents()的方法区别分析
2013/04/26 Javascript
你必须知道的JavaScript 中字符串连接的性能的一些问题
2013/05/07 Javascript
JS中数组Array的用法示例介绍
2014/02/20 Javascript
jquery高级编程的最佳实践详解
2014/03/23 Javascript
Node.js 服务器端应用开发框架 -- Hapi.js
2014/07/29 Javascript
什么是 AngularJS?AngularJS简介
2014/12/06 Javascript
JS解析XML文件和XML字符串详解
2015/04/17 Javascript
BootStrap下拉框在firefox浏览器界面不友好的解决方案
2016/08/18 Javascript
微信小程序 常见问题总结(4058,40013)及解决办法
2017/01/11 Javascript
Angular2入门教程之模块和组件详解
2017/05/28 Javascript
JS中的事件委托实例浅析
2018/03/22 Javascript
el-input 标签中密码的显示和隐藏功能的实例代码
2019/07/19 Javascript
原生javascript制作贪吃蛇小游戏的方法分析
2020/02/26 Javascript
浅析TypeScript 命名空间
2020/03/19 Javascript
Python使用win32 COM实现Excel的写入与保存功能示例
2018/05/03 Python
Python 中Django安装和使用教程详解
2019/07/03 Python
Django2 连接MySQL及model测试实例分析
2019/12/10 Python
深入浅析Python 命令行模块 Click
2020/03/11 Python
Python读取excel文件中带公式的值的实现
2020/04/17 Python
Python应用实现双指数函数及拟合代码实例
2020/06/19 Python
css3 利用transform打造走动的2D时钟
2020/10/20 HTML / CSS
HTML5+CSS设置浮动却没有动反而在中间且错行的问题
2020/05/26 HTML / CSS
捷克浴室和厨房设备购物网站:SIKO
2018/08/11 全球购物
Javascript如何发送一个Ajax请求
2015/01/26 面试题
大学生新闻专业个人自我评价
2013/11/12 职场文书
运动会广播稿400字
2014/01/25 职场文书
《盲人摸象》教学反思
2014/02/16 职场文书
学习保证书
2015/01/17 职场文书
Python字典和列表性能之间的比较
2021/06/07 Python
《勇者辞职不干了》上卷BD发售宣传CM公开
2022/04/08 日漫