详解Python进程间通信之命名管道

 更新时间:2017年08月28日 16:17:58   作者:kongxx  
本篇文章主要介绍了详解Python进程间通信之命名管道,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

管道是一种简单的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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Opencv实现计算两条直线或线段角度方法详解

    Opencv实现计算两条直线或线段角度方法详解

    这篇文章主要介绍了Opencv实现计算两条直线或线段角度方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2022-12-12
  • 在Docker上开始部署Python应用的教程

    在Docker上开始部署Python应用的教程

    这篇文章主要介绍了在Docker上开始部署Python应用的教程,Docker是时下最火爆的虚拟机,正在被各大云主机服务商所采用,需要的朋友可以参考下
    2015-04-04
  • python3.6实现学生信息管理系统

    python3.6实现学生信息管理系统

    这篇文章主要为大家详细介绍了python3.6实现学生信息管理系统,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-02-02
  • 使用Python写CUDA程序的方法

    使用Python写CUDA程序的方法

    下面小编就为大家带来一篇使用Python写CUDA程序的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • flask数据库序列化操作实例探究

    flask数据库序列化操作实例探究

    这篇文章主要为大家介绍了flask数据库序列化操作实例探究,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • Python DataFrame使用drop_duplicates()函数去重(保留重复值,取重复值)

    Python DataFrame使用drop_duplicates()函数去重(保留重复值,取重复值)

    这篇文章主要介绍了Python DataFrame使用drop_duplicates()函数去重(保留重复值,取重复值),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • 基于Python实现对PDF文件的OCR识别

    基于Python实现对PDF文件的OCR识别

    大家可能听说过使用Python进行OCR识别操作。在Python中,最出名的库便是Google所资助的tesseract。利用tesseract可以很轻松地对图像进行识别。现在问题来了,如果想对一个PDF文档进行OCR识别,该怎么做呢?下面一起来看看。
    2016-08-08
  • flask入门之表单的实现

    flask入门之表单的实现

    这篇文章主要介绍了flask入门之表单的实现,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-07-07
  • python之文件读取一行一行的方法

    python之文件读取一行一行的方法

    今天小编就为大家分享一篇python之文件读取一行一行的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • python wav模块获取采样率 采样点声道量化位数(实例代码)

    python wav模块获取采样率 采样点声道量化位数(实例代码)

    这篇文章主要介绍了python wav模块获取采样率 采样点声道量化位数,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-01-01

最新评论