0

0

Python 进程间通信的 multiprocessing.connection

舞夢輝影

舞夢輝影

发布时间:2026-02-14 21:59:08

|

565人浏览过

|

来源于php中文网

原创

connection.recv() 阻塞时无法感知对方异常断连,应改用 poll(timeout) 轮询判断可读状态;listener.accept() 返回的 connection 不可跨进程传递,因无法序列化内核句柄,子进程需通过 client 重建连接;authkey 必须为 ≥16 字节的 bytes;send() 不适合传输大对象,应改用 shared_memory 等机制。

python 进程间通信的 multiprocessing.connection

Connection.recv() 阻塞时怎么知道对方断连了

默认情况下 Connection.recv() 会一直卡住,直到收到数据或连接被对方关闭。但“关闭”不等于“断连”——如果对方进程崩溃、kill -9 或网络中断,本端可能永远等不到 EOF,也就不会抛出异常。

解决办法是用 Connection.poll() 加超时轮询,而不是裸调 recv()

while True:
    if conn.poll(1.0):  # 等最多 1 秒
        try:
            data = conn.recv()
            break
        except EOFError:
            print("对方已关闭连接")
            break
    else:
        # 超时,可检查 conn.closed 或做心跳逻辑
        if conn.closed:
            break
  • poll(timeout) 返回 True 表示有数据可读(或连接已关闭),False 表示超时
  • 即使对方已 exit,poll() 在多数系统上仍能较快返回 False,比盲等安全得多
  • 不要依赖 conn.closed 实时反映状态——它只在本地显式调用 close() 后才为 True,对方挂掉时这个值不变

Listener.accept() 返回的 Connection 为什么不能跨进程传递

你不能把一个 Connection 对象 pickle 后发给子进程,再在那边用——它底层绑定了文件描述符和操作系统句柄,pickle 只能序列化引用,无法复制内核资源。

常见错误场景:父进程创建 Listeneraccept() 得到 conn,然后用 multiprocessing.Process(target=handler, args=(conn,)) 传进去,运行时报 TypeError: cannot pickle '_multiprocessing.Connection' object

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

BJXSHOP网上购物系统 - 书店版
BJXSHOP网上购物系统 - 书店版

BJXSHOP购物管理系统是一个功能完善、展示信息丰富的电子商店销售平台;针对企业与个人的网上销售系统;开放式远程商店管理;完善的订单管理、销售统计、结算系统;强力搜索引擎支持;提供网上多种在线支付方式解决方案;强大的技术应用能力和网络安全系统 BJXSHOP网上购物系统 - 书店版,它具备其他通用购物系统不同的功能,有针对图书销售而进行开发的一个电子商店销售平台,如图书ISBN,图书目录

下载
  • 正确做法是让子进程自己连回去:父进程把 Listener.address 和认证码(authkey)传过去,子进程用 Client(address, authkey=...) 重建连接
  • 或者用 multiprocessing.Pipe() + spawn 启动方式,在 fork 前就建好管道,这样子进程能继承句柄(仅限 Unix,且需注意 Windows 不支持 fork)
  • Windows 下尤其要小心:spawn 模式下所有对象都得重新导入,Connection 绝对不能作为参数传入

authkey 长度不够或类型不对导致 ConnectionRefusedError

Client()Listener 时如果报 ConnectionRefusedError: [Errno 111] Connection refused,大概率不是端口问题,而是认证失败被服务端静默拒绝。

authkey 必须是 bytes 类型,且长度建议 ≥ 16 字节;太短(比如 b"123")或用字符串(如 "abc")都会导致握手失败。

  • 错误写法:Client(addr, authkey="mykey") → 字符串,自动编码可能出错
  • 正确写法:Client(addr, authkey=b"my_very_secret_key_2024")
  • 如果用 Listener(authkey=...) 指定了 key,所有 Client 必须用完全相同的 bytes 对象,大小写、长度、编码一个都不能差
  • 调试时可在服务端加 print("Auth key received:", conn._handle)(不推荐生产用),但更稳的方式是统一用 os.urandom(32) 生成并共享

Connection.send() 传大对象慢甚至卡死

Connection.send() 底层走的是 pickle + 管道/套接字,不是零拷贝。传一个几百 MB 的 numpy 数组,会先全量序列化进内存,再分块写入,极易触发 GC 停顿或 OOM。

这不是 bug,是设计使然——multiprocessing.connection 适合传控制指令、小结构体、任务 ID,不适合搬运大数据。

  • 传大数组优先用 multiprocessing.shared_memory(Python 3.8+)或 numpy.memmap,只传名字/路径和 shape
  • 如果必须用 send(),确保对象已用 __getstate__ 剥离非必要字段,避免意外带入大缓存或闭包
  • 注意 Windows 下默认使用匿名管道,缓冲区小(约 64KB),大 payload 容易阻塞;Unix 下用 socket 更稳,但仍有 pickle 开销

真正难处理的从来不是怎么连上,而是连上之后——谁负责关、什么时候关、断了怎么重试、数据边界在哪、pickle 兼容性怎么控。这些细节不写进日志,就只能靠 kill -USR1 看堆栈猜。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
python中print函数的用法
python中print函数的用法

python中print函数的语法是“print(value1, value2, ..., sep=' ', end=' ', file=sys.stdout, flush=False)”。本专题为大家提供print相关的文章、下载、课程内容,供大家免费下载体验。

192

2023.09.27

python print用法与作用
python print用法与作用

本专题整合了python print的用法、作用、函数功能相关内容,阅读专题下面的文章了解更多详细教程。

11

2026.02.03

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

551

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

214

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1552

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

640

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

885

2024.03.22

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

856

2024.04.29

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

76

2026.02.13

热门下载

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

精品课程

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

共4课时 | 22.4万人学习

Django 教程
Django 教程

共28课时 | 4.3万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.5万人学习

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

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