这是我用于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()
答案 0 :(得分:2)
s.shutdown()
和s.close()
。这应该触发阻塞调用立即终止。
答案 1 :(得分:1)
除了静态答案(这很好),还有其他选择:
您可以使用在每次recvfrom()返回后检查的volatile布尔型'terminate'成员。设置标志,然后在localhost上发送一个空数据报以使调用返回。
您可以检查每个收到的数据报中是否存在协议中没有其他含义的值,例如“STOP”。在localhost上发送这样的数据报。
TBH,我只是关闭()套接字,它更容易。