在Python中正确处理UDP的多处理
我正在尝试实现一个简单的UDP客户端和服务器。服务器应接收消息并返回已转换的消息 我对服务器的主要技术是在循环中侦听UDP消息,然后生成在Python中正确处理UDP的多处理,python,udp,multiprocessing,Python,Udp,Multiprocessing,我正在尝试实现一个简单的UDP客户端和服务器。服务器应接收消息并返回已转换的消息 我对服务器的主要技术是在循环中侦听UDP消息,然后生成多处理。对每个传入消息处理,并在每个进程实例中发送回复: class InputProcessor(Process): ... def run(self): output = self.process_input() self.sock.sendto(output, self.addr) # send a rep
多处理。对每个传入消息处理,并在每个进程实例中发送回复:
class InputProcessor(Process):
...
def run(self):
output = self.process_input()
self.sock.sendto(output, self.addr) # send a reply
if __name__ == "__main__":
print "serving at %s:%s" % (UDP_IP, UDP_PORT)
sock = socket.socket(socket.AF_INET, # Internet
socket.SOCK_DGRAM) # UDP
sock.bind((UDP_IP,UDP_PORT))
while True:
data, addr = sock.recvfrom(1024) # buffer size is 1024 bytes
print "received message: %s from %s:%s" % (data, addr[0], addr[1])
p = InputProcessor(sock, data, addr)
p.start()
在测试客户端中,我执行以下操作:
def send_message(ip, port, data):
sock = socket.socket(socket.AF_INET, # Internet
socket.SOCK_DGRAM) # UDP
print "sending: %s" % data
sock.sendto(data, (ip, port))
sock.close()
for i in xrange(SECONDS*REQUESTS_PER_SECOND):
data = generate_data()
p = multiprocessing.Process(target=send_message, args=(UDP_IP,
UDP_PORT,
data))
p.start()
time.sleep(1/REQUESTS_PER_SECOND)
我对上面代码的问题是,当每秒请求数
高于某个值(~50)时,一些客户端进程似乎接收到针对不同进程的响应,即进程1接收进程2的响应,反之亦然
请尽可能多地批评我的代码,因为我是网络编程新手,可能会错过一些明显的东西。也许出于某种原因,使用Twisted、hovewer甚至更值得,我对理解其内部结构非常感兴趣。谢谢。根据前面的回答,我认为主要原因是客户端的UDP端口存在竞争条件。我看不到客户端代码的接收,但它可能类似于服务器部分的接收。我认为具体来说,对于低于50个请求/秒的值,请求-响应往返完成,客户端退出。当更多请求到达时,可能会有多个进程阻止读取UDP套接字,然后可能无法确定哪个客户端进程接收传入消息。如果网络延迟在实际设置中更大,那么这个限制会更快达到。非常感谢大家!似乎我已经找到了我的代码失败的原因。我在客户端中使用了multiprocessing.Manager().dict()
来检查服务器的结果是否正确。然而,我没有使用任何锁将一组写入操作包装到该dict()
,因此尽管服务器的输出是正确的,但还是出现了很多错误
很快,在客户端,我对正确的服务器响应进行了不正确的检查。当然,我只是等待明天,因为Stackoverflow不允许现在就接受我自己的答案。