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

如何在主脚本中启动多个TCP监听器?多端口TCP监听异常问题求助

问题分析与解决方案

你遇到的核心问题一目了然:tcp_server方法里的while True无限循环会阻塞主线程。当你在主脚本里先调用data_x.tcp_server(),主线程就会一直卡在这个循环里,根本不会执行到启动端口y监听器的代码;调换顺序后同理,主线程被第二个监听器的循环阻塞,第一个监听器其实没真正启动。

要让两个监听器同时运行,你需要把每个监听器的监听逻辑放到独立的线程(或进程)中,让它们并行执行。这里推荐用线程,因为网络IO密集型任务用线程足够高效,且实现更简单。

解决方案:用线程分别启动两个监听器

修改你的主脚本,将每个监听器的tcp_server方法放到单独的线程中运行,这样主线程不会被阻塞,两个监听器可以同时监听各自的端口:

import listener_x
import listener_y
import threading

if __name__ == '__main__':
    # 初始化并启动端口x的监听器线程
    server_x = listener_x.TCPServer(port=xxxx)
    thread_x = threading.Thread(target=server_x.tcp_server)
    thread_x.daemon = True  # 设置为守护线程,主程序退出时自动终止
    thread_x.start()

    # 初始化并启动端口y的监听器线程
    server_y = listener_y.TCPServer(port=yyyy)
    thread_y = threading.Thread(target=server_y.tcp_server)
    thread_y.daemon = True
    thread_y.start()

    # 让主线程保持存活,否则主线程结束会立即终止所有子线程
    try:
        input("Press Enter to stop the server...\n")
    except KeyboardInterrupt:
        print("\nShutting down servers...")

额外说明

  1. 守护线程的作用:设置daemon=True后,当主程序(主线程)退出时,这些子线程会自动被终止,避免程序退出后还有残留的监听线程在后台运行。
  2. 主线程保持存活:最后加入的input或while True循环是为了让主线程不立即结束,否则主线程一旦执行完所有代码就会退出,连带所有子线程一起终止。
  3. 线程安全:你的现有代码中每个监听器都有自己的socket对象,处理客户端连接时也是用独立线程,所以不存在线程安全问题,可以放心使用。

如果你的业务后续需要更复杂的进程隔离,也可以考虑用multiprocessing模块启动多进程,但对于当前的TCP监听场景,线程已经完全够用且更轻量。

内容的提问来源于stack exchange,提问作者Mickaël Brás Dias

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 10:07:40