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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏闻道于事

Maven使用本地jar包(两种方式)

有些项目会用到一些Maven库上没有的jar包,这就需要我们自己引入了 这种情况有两种办法: 第一种方式,在pom文件中引用时使用本地路径: 首先把jar包放到...

36550
来自专栏LhWorld哥陪你聊算法

【Spark篇】--Spark中Standalone的两种提交模式

Spark中Standalone有两种提交模式,一个是Standalone-client模式,一个是Standalone-master模式。

67810
来自专栏Java进阶之路

善待你遇到的bug,它只会让你更强大!

14000
来自专栏java达人

linux(centos) 项目部署阶段相关命令汇总

1、ssh免密码登陆 主要命令 cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys-->添加公钥 service s...

23380
来自专栏Java成神之路

Linux_异常_01_CentOS7无法ping 百度

当时设置的网关为:  GATEWAY=192.168.1.1    。是因为这个网关设置错了。这个网关的值要从虚拟机——编辑——虚拟网络编辑器下面去查看。如下图

9910
来自专栏Android干货

Android项目实战(四十八):架构之组件化开发

11830
来自专栏Android小菜鸡

通过apktool反编译APK

https://blog.csdn.net/vipzjyno1/article/details/21039349/

1.1K20
来自专栏JavaEdge

Spring Schedule + Redission构建分布式任务调度

所用源码已上传 https://github.com/Wasabi1234/mmall4.0 介绍 ? ? 官网 ? ? ? 集成 ? ? ? image.p...

45730
来自专栏Java后端生活

JDBC(七)处理事务和事务的隔离级别

1. 原子性(Atomicity)原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。

16150
来自专栏LanceToBigData

Maven(二)Maven项目的创建(命令、myeclipse)及生命周期

上一篇给大家介绍了Maven的概念和仓库的一些信息,接下来给大家分享一下使用命令和MyEclipse创建Maven项目 一、使用命令管理Maven项目 1.1、...

22590

扫码关注云+社区

领取腾讯云代金券