详解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解析模块(ConfigParser)使用方法
Dec 10 Python
介绍Python的Urllib库的一些高级用法
Apr 30 Python
Empty test suite.(PyCharm程序运行错误的解决方法)
Nov 30 Python
搭建python django虚拟环境完整步骤详解
Jul 08 Python
简单瞅瞅Python vars()内置函数的实现
Sep 27 Python
VSCode中自动为Python文件添加头部注释
Nov 14 Python
python 读取数据库并绘图的实例
Dec 03 Python
使用Python脚本从文件读取数据代码实例
Jan 19 Python
Python3通过chmod修改目录或文件权限的方法示例
Jun 08 Python
python3.6.8 + pycharm + PyQt5 环境搭建的图文教程
Jun 11 Python
keras用auc做metrics以及早停实例
Jul 02 Python
python设置表格边框的具体方法
Jul 17 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
《斗罗大陆》六翼天使武魂最强,为什么老千家不是上三宗?
2020/03/02 国漫
Phpbean路由转发的php代码
2008/01/10 PHP
轻松掌握php设计模式之访问者模式
2016/09/23 PHP
Yii2框架类自动加载机制实例分析
2018/05/02 PHP
Laravel 数据库加密及数据库表前缀配置方法
2019/10/10 PHP
php面向对象基础详解【星际争霸游戏案例】
2020/01/23 PHP
Prototype使用指南之form.js
2007/01/10 Javascript
IE和Firefox下javascript的兼容写法小结
2008/12/10 Javascript
Javascript String对象扩展HTML编码和解码的方法
2009/06/02 Javascript
JavaScript定时器详解及实例
2013/08/01 Javascript
jQuery中fadeOut()方法用法实例
2014/12/24 Javascript
JavaScript编写简单的计算器
2015/11/25 Javascript
js如何判断输入字符串长度
2015/12/16 Javascript
JS实现登录页面记住密码和enter键登录方法推荐
2016/05/10 Javascript
JS读取XML文件数据并以table形式显示数据的方法(兼容IE与火狐)
2016/06/02 Javascript
js 打开新页面在屏幕中间的实现方法
2016/11/02 Javascript
JavaScript数据结构之二叉树的删除算法示例
2017/04/13 Javascript
NodeJS、NPM安装配置步骤(windows版本) 以及环境变量详解
2017/05/13 NodeJs
webpack构建的详细流程探底
2018/01/08 Javascript
vue.js根据代码运行环境选择baseurl的方法
2018/02/28 Javascript
jQuery实现浏览器之间跳转并传递参数功能【支持中文字符】
2018/03/28 jQuery
微信小程序实现弹出菜单功能
2018/06/12 Javascript
vue.js的双向数据绑定Object.defineProperty方法的神奇之处
2019/01/18 Javascript
JavaScript中十种一步拷贝数组的方法实例详解
2019/04/22 Javascript
JS this关键字在ajax中使用出现问题解决方案
2020/07/17 Javascript
vue动画—通过钩子函数实现半场动画操作
2020/08/09 Javascript
vue 导航锚点_点击平滑滚动,导航栏对应变化详解
2020/08/10 Javascript
[07:12]2014DOTA2西雅图国际邀请赛 黑马Liquid专题采访
2014/07/12 DOTA
用Python进行简单图像识别(验证码)
2018/01/19 Python
django如何连接已存在数据的数据库
2018/08/14 Python
python 通过类中一个方法获取另一个方法变量的实例
2019/01/22 Python
python画图时设置分辨率和画布大小的实现(plt.figure())
2021/01/08 Python
测量实习生自我鉴定
2013/09/19 职场文书
应届毕业生简历自我评价
2014/01/31 职场文书
2015年中学图书馆工作总结
2015/07/22 职场文书
SQL试题 使用窗口函数选出连续3天登录的用户
2022/04/24 Oracle