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

发布时间 - 2026-01-11 02:59:59    点击率:

管道是一种简单的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进程间通信 multiProcessing Queue队列实现详解  # Python进程间通信Queue消息队列用法分析  # Python进程间通信Queue实例解析  # Python实现进程同步和通信的方法  # python多进程实现进程间通信实例  # Python进程间通信之共享内存详解  # Python进程间通信用法实例  # python进程间通信Queue工作过程详解  # 另外一个  # 来实现  # 创建一个  # 是一个  # 是一种  # 多个  # 不需要  # 信道  # 它是  # 我们可以  # 因为它  # 只在  # 它会  # 文件系统  # 大家多多  # 时需  # 只写  # break  # close  # write 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 浅述节点的创建及常见功能的实现  iOS验证手机号的正则表达式  装修招标网站设计制作流程,装修招标流程?  如何在HTML表单中获取用户输入并用JavaScript动态控制复利计算循环  作用域操作符会触发自动加载吗_php类自动加载机制与::调用【教程】  LinuxCD持续部署教程_自动发布与回滚机制  魔毅自助建站系统:模板定制与SEO优化一键生成指南  深入理解Android中的xmlns:tools属性  Laravel如何监控和管理失败的队列任务_Laravel失败任务处理与监控  JS实现鼠标移上去显示图片或微信二维码  如何在自有机房高效搭建专业网站?  黑客如何利用漏洞与弱口令入侵网站服务器?  jQuery中的100个技巧汇总  免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?  如何在万网利用已有域名快速建站?  Laravel如何构建RESTful API_Laravel标准化API接口开发指南  Laravel如何发送邮件和通知_Laravel邮件与通知系统发送步骤  如何挑选优质建站一级代理提升网站排名?  Laravel API资源(Resource)怎么用_格式化Laravel API响应的最佳实践  Laravel的HTTP客户端怎么用_Laravel HTTP Client发起API请求教程  手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?  CSS3怎么给轮播图加过渡动画_transition加transform实现【技巧】  美食网站链接制作教程视频,哪个教做美食的网站比较专业点?  Laravel模型事件有哪些_Laravel Model Event生命周期详解  php json中文编码为null的解决办法  Laravel中DTO是什么概念_在Laravel项目中使用数据传输对象(DTO)  Laravel项目结构怎么组织_大型Laravel应用的最佳目录结构实践  利用vue写todolist单页应用  Laravel如何配置.env文件管理环境变量_Laravel环境变量使用与安全管理  mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?  JS碰撞运动实现方法详解  Claude怎样写结构化提示词_Claude结构化提示词写法【教程】  中山网站推广排名,中山信息港登录入口?  ChatGPT常用指令模板大全 新手快速上手的万能Prompt合集  Linux虚拟化技术教程_KVMQEMU虚拟机安装与调优  Win11怎么关闭专注助手 Win11关闭免打扰模式设置【操作】  深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?  JavaScript如何实现音频处理_Web Audio API如何工作?  php后缀怎么变mp4格式错误_修改扩展名提示格式不对怎么办【技巧】  如何为不同团队 ID 动态生成多个非值班状态按钮  香港网站服务器数量如何影响SEO优化效果?  手机软键盘弹出时影响布局的解决方法  Laravel路由怎么定义_Laravel核心路由系统完全入门指南  Win11怎么查看显卡温度 Win11任务管理器查看GPU温度【技巧】  Laravel如何实现事件和监听器?(Event & Listener实战)  网站页面设计需要考虑到这些问题  Javascript中的事件循环是如何工作的_如何利用Javascript事件循环优化异步代码?  百度浏览器网页无法复制文字怎么办 百度浏览器复制修复  html5的keygen标签为什么废弃_替代方案说明【解答】  jquery插件bootstrapValidator表单验证详解