详解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模块restful使用方法实例
Dec 10 Python
python实现的文件同步服务器实例
Jun 02 Python
Python实现多线程的两种方式分析
Aug 29 Python
Python操作mongodb数据库的方法详解
Dec 08 Python
关于python之字典的嵌套,递归调用方法
Jan 21 Python
python集合是否可变总结
Jun 20 Python
python 模拟创建seafile 目录操作示例
Sep 26 Python
python子线程退出及线程退出控制的代码
Oct 16 Python
使用Python爬虫库BeautifulSoup遍历文档树并对标签进行操作详解
Jan 25 Python
python实现IOU计算案例
Apr 12 Python
详解python中的异常和文件读写
Jan 03 Python
Django+Nginx+uWSGI 定时任务的实现方法
Jan 22 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实现图片旋转效果实例代码
2014/10/01 PHP
Laravel 5框架学习之Eloquent 关系
2015/04/09 PHP
php实现图片上传并利用ImageMagick生成缩略图
2016/03/14 PHP
Yii2 GridView实现列表页直接修改数据的方法
2016/05/16 PHP
javascript 写类方式之四
2009/07/05 Javascript
javascript eval和JSON之间的联系
2009/12/31 Javascript
JavaScript调用堆栈及setTimeout使用方法深入剖析
2013/02/16 Javascript
JQuery调用WebServices的方法和4个实例
2014/05/06 Javascript
JavaScript中split与join函数的进阶使用技巧
2016/05/03 Javascript
jquery 正整数数字校验正则表达式
2017/01/10 Javascript
zTree实现节点修改的实时刷新功能
2017/03/20 Javascript
JS中的数组转变成JSON格式字符串的方法
2017/05/09 Javascript
jQuery+PHP+Mysql实现抽奖程序
2020/04/12 jQuery
JavaScript之RegExp_动力节点Java学院整理
2017/06/29 Javascript
vue数字类型过滤器的示例代码
2017/09/07 Javascript
详解微信小程序实现跑马灯效果(附完整代码)
2019/04/29 Javascript
javascript原型链学习记录之继承实现方式分析
2019/05/01 Javascript
axios实现简单文件上传功能
2019/09/25 Javascript
Openlayers3实现车辆轨迹回放功能
2020/09/29 Javascript
浅谈vue.watch的触发条件是什么
2020/11/07 Javascript
利用python打印出菱形、三角形以及矩形的方法实例
2017/08/08 Python
浅谈numpy库的常用基本操作方法
2018/01/09 Python
详解pandas库pd.read_excel操作读取excel文件参数整理与实例
2019/02/17 Python
Python中单线程、多线程和多进程的效率对比实验实例
2019/05/14 Python
Python实现微信翻译机器人的方法
2019/08/13 Python
使用pytorch完成kaggle猫狗图像识别方式
2020/01/10 Python
Python爬取酷狗MP3音频的步骤
2021/02/26 Python
奶茶专卖店创业计划书
2014/01/18 职场文书
2014年商场超市庆元旦活动方案
2014/02/14 职场文书
小学模范班主任事迹材料
2014/05/13 职场文书
机械设计及其自动化专业求职信
2014/06/09 职场文书
小学庆六一活动总结
2014/08/28 职场文书
忠诚与背叛观后感
2015/06/04 职场文书
公司处罚决定书
2015/06/24 职场文书
SQL Server中的游标介绍
2022/05/20 SQL Server
SQL Server数据库的三种创建方法汇总
2023/05/08 MySQL