2014-03-01 28 views
1

这是我用于我的udp服务器的一些代码。我的问题是当我调用方法terminate时,它只会在它从udp套接字接收到另一个消息后停止侦听循环。当我调用终止方法时,我想立即停止线程。或者有更好的方法来做到这一点?由于如何停止python中的udp套接字线程?

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

你可以看看'import select'或'import twisted'(需要安装)以替代线程。 – User

回答

2

在你的终止方法,你可以调用s.shutdown()s.close()。这应该会触发阻塞呼叫立即终止。

+0

用哪种方法必须运行关机? SHUT_RD? SHUT_RDRW? –

1

除了staticd答案,(这是罚款),也可以选择:

你可以使用挥发性布尔“终止”是每一个recvfrom的()返回后检查成员。设置该标志,然后在本地主机上发送一个空数据报以使呼叫返回。

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

TBH,我只是关闭()插座,这很容易。