您的位置 首页 编程知识

Python多进程Pipe报错“管道已关闭”如何解决?

Python多进程Pipe中“管道已关闭”错误的解决方案 在使用Python的multiprocessing模…

Python多进程Pipe报错“管道已关闭”如何解决?

Python多进程Pipe中“管道已关闭”错误的解决方案

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

问题根源在于主进程与子进程间的协调性。当子进程使用child_conn.recv()等待主进程发送数据时,如果主进程在子进程接收数据前意外终止,child_conn将被关闭,导致子进程尝试读取已关闭的管道,从而引发错误。

在原代码中,子进程无限期地等待主进程信号,这在主进程提前结束时会引发问题。 有效的是:在子进程中使用try…except块捕获EOFError异常。当主进程退出时,child_conn会关闭,尝试读取数据将抛出EOFError。 通过捕获此异常,可以防止程序崩溃,并允许子进程以更优雅的方式处理这种情况。

立即学习“”;

以下是改进后的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 err:         print(f"Caught EOFError: {err}")   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 import time   def main():     server = Server()     result = server.run()     print("r:", result)     time.sleep(5)     # server.stop()  # 解注释后,问题依然解决   if __name__ == "__main__":     main()
登录后复制

通过捕获EOFError异常,即使主进程提前结束,子进程也能干净地退出,有效避免了“管道已关闭”错误,提升了程序的健壮性。

以上就是Python多进程Pipe报错“管道已关闭”如何解决?的详细内容,更多请关注php中文网其它相关文章!

本文来自网络,不代表四平甲倪网络网站制作专家立场,转载请注明出处:http://www.elephantgpt.cn/8144.html

作者: nijia

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

联系我们

联系我们

18844404989

在线咨询: QQ交谈

邮箱: 641522856@qq.com

工作时间:周一至周五,9:00-17:30,节假日休息

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部