Python中正确处理UDP的多处理方法

2024-10-01 11:25:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图实现一个简单的UDP客户端和服务器。服务器应该接收一条消息并返回一条经过转换的消息。在

我对服务器的主要技术是在循环中侦听UDP消息,然后为每个传入消息生成multiprocessing.Process,并在每个Process实例中发送回复:

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()

在test client中,我做如下操作:

^{pr2}$

我在上面的代码中遇到的问题是,当REQUESTS_PER_SECOND高于某个值(~50),似乎有些客户端进程接收到指定给不同进程的响应,即进程1接收进程2的响应,反之亦然。在

请尽量批评我的代码,因为我是网络编程新手,可能会错过一些明显的东西。也许出于某种原因,使用Twisted,hovewer会更有价值和更好,我对理解其内部结构非常感兴趣。谢谢。在


Tags: selfip服务器消息客户端outputdata进程
2条回答

根据前面的回答,我认为主要原因是客户端在UDP端口存在竞争条件。我看不到客户端的接收代码,但它大概与服务器部分的代码类似。我认为具体情况是,对于低于50个请求/秒的值,请求-响应往返完成,客户端退出。当更多的请求到达时,可能有多个进程阻塞读取UDP套接字,然后可能无法确定哪个客户端进程接收到传入消息。如果在实际设置中,网络延迟将更大,则此限制将更快地达到。在

非常感谢大家!似乎我已经找到了我的代码失败的原因了。我在客户机中使用multiprocessing.Manager().dict()来检查来自服务器的结果是否正确。但是,我没有使用任何锁来包装对dict()的一组写操作,因此尽管服务器的输出是正确的,但还是出现了很多错误。在

很快,在客户机中,我执行了错误的服务器响应检查。在

相关问题 更多 >