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

Python多端口UDP服务器报错:无法启动新线程问题排查

解决Python UDP多端口监听时的thread.error: can't start new thread问题

嘿,我一眼就看到问题出在哪了——你的run_server函数里有个致命的无限循环:

while 1:
    thread.start_new_thread(run_socket, (s1, "A"))
    thread.start_new_thread(run_socket, (s2, "B"))
    thread.start_new_thread(run_socket, (s3, "C"))

这个循环会不停地创建新线程,而每个run_socket函数本身又是一个无限循环(负责持续处理UDP请求),旧的线程根本不会退出。系统能创建的线程数量是有上限的,很快你就会把系统的线程配额耗尽,自然就抛出can't start new thread错误了。

正确的做法是什么?

你只需要为每个端口启动一次线程就够了,因为每个线程已经在自己的无限循环里处理请求了。另外,我建议你用更现代的threading模块代替老旧的thread模块,它的API更安全、功能更完善。

下面是修正后的代码:

import socket
import threading

def create_socket_server(host, port):
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    s.bind((host, port))
    return s

def run_socket(s, secret):
    while True:
        data, addr = s.recvfrom(1024)
        # Python3需要将字符串转为字节流,Python2可省略encode
        s.sendto(secret.encode('utf-8'), addr)

def run_server():
    s1 = create_socket_server('127.0.0.1', 2000)
    s2 = create_socket_server('127.0.0.1', 3000)
    s3 = create_socket_server('127.0.0.1', 4000)
    
    # 为每个端口启动一次线程即可
    threading.Thread(target=run_socket, args=(s1, "A")).start()
    threading.Thread(target=run_socket, args=(s2, "B")).start()
    threading.Thread(target=run_socket, args=(s3, "C")).start()
    
    # 让主线程保持运行,避免子线程随主线程退出而终止
    try:
        while True:
            pass
    except KeyboardInterrupt:
        print("服务器正在关闭...")

if __name__ == "__main__":
    run_server()

关键修改点说明:

  • 移除线程创建的无限循环:每个端口只需要一个线程长期运行,就能处理所有到来的UDP请求
  • 替换为threading模块:相比旧的thread模块,threading支持更多线程管理特性,比如守护线程、线程join等
  • 添加主线程保持逻辑:主线程如果直接退出,所有子线程也会被强制终止,这里用无限循环让主线程一直运行,同时支持Ctrl+C优雅退出
  • 字符串编码处理:适配Python3的字节流要求,确保sendto能正常发送数据

额外小建议

如果你的场景不需要多线程,也可以用select模块单线程处理多个UDP套接字,这样更节省系统资源;但如果每个端口的逻辑以后会变得复杂,多线程的方式会更易维护。

内容的提问来源于stack exchange,提问作者Brian Brown

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:17:01