2014-03-01 2 views
1

이것은 내 udp 서버에 사용 된 코드입니다. 내 문제는 내가 메서드를 종료 호출 할 때 그것만 udp 소켓에서 다른 메시지를받은 후 수신 루프를 중지합니다. 메서드를 종료 할 때 즉시 스레드를 중지하고 싶습니다. 아니면 이것을하는 더 좋은 방법이 있습니까? 당신의 종료 방법에 감사파이썬에서 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() 반환 후 체크 멤버 '종료'휘발성 부울을 사용할 수 있습니다. 플래그를 설정 한 다음 호출을 되돌리려면 localhost에 빈 데이터 그램을 보냅니다.

프로토콜에서 다른 의미가없는 값 (예 : '중지')을 수신 한 모든 데이터 그램을 확인할 수 있습니다. Localhost에서 그런 데이터 그램을 보냅니다.

TBH, 난 그냥 shutdown() 소켓, 더 쉽습니다.