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

Python多进程UDP服务器在Linux与macOS上的表现差异问题

Python多进程UDP服务器在macOS上的负载均衡问题

我开发了一个Python多进程UDP服务器(代码如下),可以正常启动指定数量的进程。在Linux系统中,UDP数据能在多个进程间实现负载均衡;但在macOS系统上,似乎只有一个进程能接收数据。请问我在macOS上是否遗漏了某些配置参数?

from multiprocessing import Pool
import socket
import os

def s(PORT):
    UDP_IP = ""
    UDP_PORT = PORT

    sock = socket.socket(socket.AF_INET, # Internet
                        socket.SOCK_DGRAM) # UDP
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
    sock.bind((UDP_IP, UDP_PORT))
    print(f"Started server {os.getpid()}")

    while True:
        data, addr = sock.recvfrom(1024)
        print(f"Received message on {os.getpid()}: {data}")

if __name__ == '__main__':
    print(f"Program started {os.getpid()}")
    with Pool(5) as p:
        p.map(s, [8000] * 5)

macOS运行输出

Program started 32205
Started server 32233
Started server 32235
Started server 32234
Started server 32232
Started server 32236
Received message on 32233: b'hello 1'
Received message on 32233: b'hello 2'
Received message on 32233: b'hello 3'
Received message on 32233: b'hello 4'
Received message on 32233: b'hello 5'
Received message on 32233: b'hello 6'
Received message on 32233: b'hello 7'
Received message on 32233: b'hello 8'
Received message on 32233: b'hello 9'
Received message on 32233: b'hello 10'

Linux运行输出

Program started 1860163
Started server 1860165
Started server 1860164
Started server 1860166
Started server 1860167
Started server 1860168
Received message on 1860167: b'hello 1'
Received message on 1860165: b'hello 2'
Received message on 1860167: b'hello 3'
Received message on 1860167: b'hello 4'
Received message on 1860164: b'hello 5'
Received message on 1860168: b'hello 6'
Received message on 1860164: b'hello 7'
Received message on 1860167: b'hello 8'
Received message on 1860167: b'hello 9'
Received message on 1860164: b'hello 10'

我尝试过SO_REUSEADDR,但仅能启动一个进程,推测其他进程在等待bind完成,而第一个进程已占用端口。我还尝试用gunicorn实现守护进程,但仍存在仅一个工作进程接收数据的问题,以下是简化版代码:

# 运行命令:gunicorn udp_server --reuse-port -w 5
import socket
import os

UDP_IP = ""
UDP_PORT = 8001

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
sock.bind((UDP_IP, UDP_PORT))
print(f"Process started {os.getpid()}")

while True:
    data, addr = sock.recvfrom(1024)
    print(f"Received message ({os.getpid()}): {data}")

附加:UDP数据发送命令

for i in `seq 100`; do echo -n "hello $i" | nc -u -w 1 127.0.0.1 8000; done

内容的提问来源于stack exchange,提问作者Kapil Singaria

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 15:32:12