详解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选择排序、冒泡排序、合并排序代码实例
Apr 10 Python
Python查询IP地址归属完整代码
Jun 21 Python
python编程羊车门问题代码示例
Oct 25 Python
python3+PyQt5实现文档打印功能
Apr 24 Python
python复制文件到指定目录的实例
Apr 27 Python
Python实现的大数据分析操作系统日志功能示例
Feb 11 Python
Django Rest framework解析器和渲染器详解
Jul 25 Python
Django分组聚合查询实例分享
Apr 29 Python
学习python需要有编程基础吗
Jun 02 Python
Python基础教程之输入输出和运算符
Jul 26 Python
Python如何操作docker redis过程解析
Aug 10 Python
Python合并pdf文件的工具
Jul 01 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实现将浏览历史页面网址保存到cookie的方法
2015/01/26 PHP
Mac版PhpStorm之XAMPP整合apache服务器配置的图文教程详解
2016/10/13 PHP
PHP使用第三方即时获取物流动态实例详解
2017/04/27 PHP
老生常谈PHP数组函数array_merge(必看篇)
2017/05/25 PHP
阿里云PHP SMS短信服务验证码发送方法
2017/07/11 PHP
JQuery自适应IFrame高度(支持嵌套 兼容IE,ff,safafi,chrome)
2011/03/28 Javascript
6款经典实用的jQuery小插件及源码(对话框/提示工具等等)
2013/02/04 Javascript
JS判断客户端是手机还是PC的2个代码
2014/04/12 Javascript
JQuery控制radio选中和不选中方法总结
2015/04/15 Javascript
JavaScript正则表达式中的ignoreCase属性使用详解
2015/06/16 Javascript
JavaScript中的call方法和apply方法使用对比
2015/08/12 Javascript
js实现仿微博滚动显示信息的效果
2015/12/21 Javascript
jquery自定义右键菜单、全选、不连续选择
2016/03/01 Javascript
jQuery中Find选择器用法示例
2016/09/21 Javascript
AngularJS通过ng-route实现基本的路由功能实例详解
2016/12/13 Javascript
jquery实现提示语淡入效果
2017/05/05 jQuery
基于Vue的移动端图片裁剪组件功能
2017/11/28 Javascript
JavaScript this在函数中的指向及实例详解
2019/10/14 Javascript
Python使用defaultdict读取文件各列的方法
2017/05/11 Python
详解PyTorch批训练及优化器比较
2018/04/28 Python
tensorflow学习教程之文本分类详析
2018/08/07 Python
对PyQt5中的菜单栏和工具栏实例详解
2019/06/20 Python
Python OpenCV实现鼠标画框效果
2020/08/19 Python
利用python中集合的唯一性实现去重
2020/02/11 Python
Python3自定义http/https请求拦截mitmproxy脚本实例
2020/05/11 Python
使用Python实现微信拍一拍功能的思路代码
2020/07/09 Python
Python可视化工具如何实现动态图表
2020/10/23 Python
浅谈pc和移动端的响应式的使用
2019/01/03 HTML / CSS
海蓝之谜英国官网:La Mer英国
2020/01/15 全球购物
品质主管的岗位职责
2013/12/04 职场文书
老公给老婆的保证书
2014/04/28 职场文书
银行求职信范文怎么写
2015/03/20 职场文书
eclipse创建项目没有dynamic web的解决方法
2021/06/24 Java/Android
pandas进行数据输入和输出的方法详解
2022/03/23 Python
【DOTA2】当街暴打?PSG LGD vs VG - DPC 2022 WINTER TOUR CN
2022/04/02 DOTA
CentOS安装Nginx并部署vue
2022/04/12 Servers