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

yipeiwu_com5年前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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持【听图阁-专注于Python设计】。

相关文章

python数字图像处理实现直方图与均衡化

python数字图像处理实现直方图与均衡化

在图像处理中,直方图是非常重要,也是非常有用的一个处理要素。 在skimage库中对直方图的处理,是放在exposure这个模块中。 1、计算直方图 函数:skimage.exposur...

python函数装饰器之带参数的函数和带参数的装饰器用法示例

本文实例讲述了python函数装饰器之带参数的函数和带参数的装饰器用法。分享给大家供大家参考,具体如下: 1. 函数带多个参数 # 普通的装饰器, 打印函数的运行时间 def dec...

django 通过URL访问上传的文件方法

django 通过URL访问上传的文件方法

Django2.0 通过URL访问上传的文件(pdf、picture等) Django是一个成熟的web框架,基于python实现,有很多的优点,很容易快速上手(详见官网:https:/...

基于python解线性矩阵方程(numpy中的matrix类)

这学期有一门运筹学,讲的两大块儿:线性优化和非线性优化问题。在非线性优化问题这里涉及到拉格朗日乘子法,经常要算一些非常变态的线性方程,于是我就想用python求解线性方程。查阅资料的过程...

PyCharm设置每行最大长度限制的方法

PyCharm设置每行最大长度限制的方法

编写Python代码,大家都需要遵循PEP8,因此在pycharm中,如何设置每行最大长度限制,成为了一个小的知识盲点,在这里做一下记录,方便以后查看。 File→Settings→Co...