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
相关产品推荐
相关产品推荐

