0

0

Python多进程Pipe通信中如何优雅地处理“管道已关闭”错误?

心靈之曲

心靈之曲

发布时间:2025-03-22 09:06:01

|

756人浏览过

|

来源于php中文网

原创

python多进程pipe通信中如何优雅地处理“管道已关闭”错误?

Python多进程Pipe通信:“管道已关闭”错误的优雅解决方案

在使用Python的multiprocessing模块中的Pipe方法进行进程间通信时,可能会遇到令人头疼的“管道已关闭”错误。本文将深入分析该问题,并提供一种更稳健的解决方案。

问题通常出现在父子进程通信场景中。例如,子进程执行耗时任务后,通过管道向父进程发送数据,并等待父进程的信号来结束自身。如果父进程提前结束,子进程试图从已关闭的管道接收数据,就会引发“管道已关闭”错误。

虽然在父进程中添加time.sleep()和显式关闭子进程的方法可以解决问题,但这并非理想方案,因为它依赖于父进程的主动等待和控制。

立即学习Python免费学习笔记(深入)”;

更优雅的解决方法是在子进程中捕获EOFError异常。当父进程提前结束时,子进程尝试从管道接收数据时会引发此异常。通过捕获该异常,子进程可以优雅地退出,避免程序崩溃。

Cutout.Pro抠图
Cutout.Pro抠图

AI批量抠图去背景

下载

以下展示了改进后的service.pysingle.py代码:

改进后的service.py:

import os
from multiprocessing import Process, Pipe

def start_child_process(child_conn):
    # 模拟耗时任务
    # run_server_for_long_time()
    child_conn.send({"port": 123, "ret": 1, "pid": os.getpid()})

    try:
        signal = child_conn.recv()  # 等待父进程信号
        if signal:
            child_conn.close()
    except EOFError as e:
        print(f"子进程捕获到EOFError: {e}")  # 优雅处理异常
        # 可在此添加必要的清理工作

class Server:
    def __init__(self):
        self.child_conn = None
        self.child = None
        self.parent_conn, self.child_conn = Pipe()

    def run(self):
        self.child = Process(target=start_child_process, name="my_child_process", args=(self.child_conn,))
        self.child.start()

        data = self.parent_conn.recv()
        result = {
            "endpoints": {
                "http": f"http://127.0.0.1:{data['port']}/cmd",
                "ws": f"ws://127.0.0.1:{data['port']}/api",
            }
        }
        return result

    def stop(self):
        self.parent_conn.send(True)
        self.child.join()
        self.child = None

if __name__ == "__main__":
    server = Server()
    r = server.run()
    print("r:", r)

改进后的single.py:

from service import Server

def main():
    server = Server()
    result = server.run()
    print("r:", result)
    # server.stop() # 可选:显式停止子进程

if __name__ == "__main__":
    main()

通过在子进程中添加try...except块来捕获EOFError,即使父进程意外退出,子进程也能优雅地结束,避免了“管道已关闭”错误。这种方法提高了程序的健壮性,无需依赖父进程的显式关闭操作。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
go语言 注释编码
go语言 注释编码

本专题整合了go语言注释、注释规范等等内容,阅读专题下面的文章了解更多详细内容。

0

2026.01.31

go语言 math包
go语言 math包

本专题整合了go语言math包相关内容,阅读专题下面的文章了解更多详细内容。

1

2026.01.31

go语言输入函数
go语言输入函数

本专题整合了go语言输入相关教程内容,阅读专题下面的文章了解更多详细内容。

1

2026.01.31

golang 循环遍历
golang 循环遍历

本专题整合了golang循环遍历相关教程,阅读专题下面的文章了解更多详细内容。

0

2026.01.31

Golang人工智能合集
Golang人工智能合集

本专题整合了Golang人工智能相关内容,阅读专题下面的文章了解更多详细内容。

1

2026.01.31

2026赚钱平台入口大全
2026赚钱平台入口大全

2026年最新赚钱平台入口汇总,涵盖任务众包、内容创作、电商运营、技能变现等多类正规渠道,助你轻松开启副业增收之路。阅读专题下面的文章了解更多详细内容。

66

2026.01.31

高干文在线阅读网站大全
高干文在线阅读网站大全

汇集热门1v1高干文免费阅读资源,涵盖都市言情、京味大院、军旅高干等经典题材,情节紧凑、人物鲜明。阅读专题下面的文章了解更多详细内容。

71

2026.01.31

无需付费的漫画app大全
无需付费的漫画app大全

想找真正免费又无套路的漫画App?本合集精选多款永久免费、资源丰富、无广告干扰的优质漫画应用,涵盖国漫、日漫、韩漫及经典老番,满足各类阅读需求。阅读专题下面的文章了解更多详细内容。

67

2026.01.31

漫画免费在线观看地址大全
漫画免费在线观看地址大全

想找免费又资源丰富的漫画网站?本合集精选2025-2026年热门平台,涵盖国漫、日漫、韩漫等多类型作品,支持高清流畅阅读与离线缓存。阅读专题下面的文章了解更多详细内容。

19

2026.01.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.4万人学习

Django 教程
Django 教程

共28课时 | 3.7万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号