如何在python中停止udp套接字线程?

时间:2014-03-01 08:49:46

标签: python multithreading sockets udp

这是我用于udp服务器的一些代码。我的问题是当我调用方法终止时,它只会在从udp socket接收到另一条消息后停止监听循环。我想在调用terminate方法时立即停止线程。或者有更好的方法吗?感谢

    class StartThread:
        def __init__(self):
            self._running = True
            self.s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
            self.s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
            self.s.bind(("0.0.0.0", 1234))        

        def terminate(self):
            self._running = False

        def run(self):    
            while  self._running:
                data, addr = self.s.recvfrom(1024)

c = StartThread()
t = Thread(target=c.run)
t.start()  

2 个答案:

答案 0 :(得分:2)

在您的终止方法中,您可以拨打s.shutdown()s.close()。这应该触发阻塞调用立即终止。

答案 1 :(得分:1)

除了静态答案(这很好),还有其他选择:

您可以使用在每次recvfrom()返回后检查的volatile布尔型'terminate'成员。设置标志,然后在localhost上发送一个空数据报以使调用返回。

您可以检查每个收到的数据报中是否存在协议中没有其他含义的值,例如“STOP”。在localhost上发送这样的数据报。

TBH,我只是关闭()套接字,它更容易。