You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

执行队列命令时触发Errno 98: Address already in use错误的问题求助

执行队列命令时触发Errno 98: Address already in use错误的问题求助

Hey there, let's dig into this OSError: [Errno 98] Address already in use issue you're hitting. From what you've shared, the queue server is accepting your connection and parsing the command, but it's throwing this error before even executing the target script—so let's break down the most likely causes and fixes.

1. 队列服务器的Socket未启用地址复用

你的队列服务器是多Worker架构(5个工作进程/线程),如果主监听Socket或者Worker的Socket没有配置SO_REUSEADDR选项,当连接关闭后端口处于TIME_WAIT状态时,新的Worker尝试使用该端口就会触发这个错误。

检查队列服务器的监听Socket初始化代码,在创建Socket后一定要加上这行关键配置:

import socket

# 在创建监听Socket后立即添加
server_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)  # 解决端口复用问题
server_sock.bind(("", QUEUE_PORT))
server_sock.listen(5)

这个配置允许操作系统复用处于TIME_WAIT状态的端口,这在多Worker的服务器架构里是必备的。

2. 被调用的脚本意外绑定了相同端口

从日志看错误发生在执行脚本之前,但也有可能你在PythonScripts目录下的脚本(比如List_Tables.py)里,不小心写了绑定QUEUE_PORT(8888)的代码——而这个端口已经被队列服务器占用了,一旦Worker尝试启动这个脚本,就会立即触发端口冲突。

快速排查方法:在队列服务器上运行以下命令,检查当前占用8888端口的进程:

sudo lsof -i :8888

如果看到除了队列主进程之外的其他进程(比如某个Python脚本进程)也占用了这个端口,那就是脚本的问题了。

3. Worker线程错误地重复绑定端口

你的process_request方法接收了client_socket参数(已经建立好的客户端连接),这是正确的做法——Worker应该只处理这个已有的连接,而不是重新创建监听Socket。但如果你的Worker初始化逻辑里,不小心让每个Worker都去绑定一次QUEUE_PORT,就会导致端口冲突。

你可以重点检查Queue.py的第64行(错误抛出的位置),看看那一行代码是不是在尝试创建或绑定Socket。比如如果Worker的run方法里有类似self.sock.bind(...)的代码,那肯定会报错,因为主进程已经绑定了这个端口。

4. 未正确关闭连接导致的TIME_WAIT堆积

当TCP连接关闭后,操作系统会把端口保留在TIME_WAIT状态几分钟,用来处理残留的数据包。如果你的测试程序频繁创建连接,或者队列服务器没有正确关闭客户端Socket,就会导致大量TIME_WAIT连接堆积,最终占满可用端口或者阻塞队列端口。

除了启用SO_REUSEADDR,你也可以在队列服务器上用以下命令查看TIME_WAIT状态的连接:

netstat -anp | grep TIME_WAIT | grep :8888

如果数量很多,那就要检查代码里的Socket关闭逻辑——比如确保所有Socket都用with语句管理(像你测试程序里那样),或者在Worker处理完请求后显式关闭client_socket。

快速调试小步骤

  1. 先在队列服务器上运行sudo lsof -i :8888,确认只有队列主进程在占用8888端口;
  2. 临时把Worker数量改成1,看看错误是否消失——如果消失了,那肯定是多Worker的Socket复用问题;
  3. 给Queue.py第64行前后加详细日志,看看触发错误时Worker正在执行什么操作(是创建Socket?还是启动脚本?)。

如果这些方法还没解决问题,可以把Queue.py第64行附近的代码贴出来,我再帮你进一步排查!

备注:内容来源于stack exchange,提问作者Database

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 12:28:00