Multiprocessing中Listener调用accept方法时挂起阻塞问题咨询
根本原因
multiprocessing.connection.Listener的accept()是阻塞方法,调用后会持续挂起进程,直到收到匹配的客户端连接请求并完成身份校验才会返回连接对象。你当前只运行了监听端代码,没有对应的客户端发起连接,所以会一直停在这一步。
配套客户端示例
你需要同时运行以下客户端代码,才能完成连接流程:
from multiprocessing.connection import Client address = ('localhost', 6000) # authkey必须和监听端完全一致,否则会握手失败无返回 conn = Client(address, authkey=b'secret password') # 连接建立后可正常收发数据 conn.send('test message from client') print('收到服务端返回:', conn.recv()) conn.close()
监听端也可以补充接收逻辑验证:
from multiprocessing.connection import Listener address = ('localhost', 6000) listener = Listener(address, authkey=b'secret password') conn = listener.accept() print('收到客户端连接:', listener.last_accepted) print('客户端消息:', conn.recv()) conn.send('response from listener') conn.close() listener.close()
异常排查
如果启动客户端后还是卡在accept(),可以检查以下项:
- 两端
authkey必须完全一致,且为字节类型,拼写错误会导致身份校验失败无返回 - 检查6000端口是否被系统防火墙、安全软件拦截
- 跨设备访问时不要用
localhost,替换为监听端的实际IP地址 - 需要非阻塞等待的场景,可以配合
select模块先监听listener的文件描述符,有连接事件触发时再调用accept()
内容的提问来源于stack exchange,提问作者Mykola Zotko
相关产品推荐
相关产品推荐

