2011-12-21 1 views
0

파이썬에서 스레딩을 사용하여 여러 텔넷 호스트에 연결하려고하지만 해결할 수없는 문제가 발생했습니다.파이썬에서 다중 텔넷 연결 스레드를 사용하는 시간 초과 및 높은 CPU로드 문제

MAC OS X 라이온/파이썬 일반적으로 2.7

import threading,telnetlib,socket 

class ReaderThread(threading.Thread): 
    def __init__(self, ip, port): 
     threading.Thread.__init__(self) 
     self.ip = ip 
     self.port = port 
     self.telnet_con = telnetlib.Telnet() 

    def run(self): 
     try: 
      print 'Start %s' % self.ip 
      self.telnet_con.open(self.ip,self.port,30) 
      print 'Done %s' % self.ip 
     except socket.timeout: 
      print 'Timeout in %s' % self.ip 

    def join(self): 
     self.telnet_con.close() 

ta = [] 

t1 = ReaderThread('10.0.1.162',9999) 
ta.append(t1) 
t2 = ReaderThread('10.0.1.163',9999) 
ta.append(t2) 

for t in ta: 
    t.start() 
print 'Threads started\n' 

작동에 다음 코드를 사용하여

하지만 스레드 중 하나는 (항상 같은 하나가 아닌) 연결 시간이 오래 걸립니다 (약 20 초 그리고 때로는 타임 아웃으로 빠져 나간다). 그 (모든 로컬 네트워크에서) 너무 오래 연결 시간 동안, CPU의 부하는 100 %까지갑니다.

배열에서 하나의 스레드 만 사용하는 경우에는 항상 완벽하게 작동한다는 사실이 더욱 이상합니다. 따라서 다중 스레드를 사용하는 것과 관련이 있습니다.

DNS 조회 문제를 피하기 위해 이미 모든 IP 주소에 대해 호스트 이름 항목을 추가했습니다. 이것은 변화를 가져 오지 않았습니다.

미리 도움을 주셔서 감사합니다.

안부

senexi

+0

얼마나 이상한가요? 잘못 작동하는 스레드의 스택 추적을 통해 멈추는 부분을 확인할 수있는 방법이 있습니까? – NPE

+0

"traceback.print_stack()"을 포함 시켰지만 새로운 정보를 가져 오지 않았습니다. 그것은 항상 telnet_con.open()에 매달린다. 나는 또한 스레딩을 사용하지 않고 버전을 시도했다. 그렇다면 연결을 설정하는 데 아직 오래 걸리지 만 더 이상 CPU 부하가 날리지 않습니다. 불행히도 내 응용 프로그램에서 스레드를 사용해야 ... :/ – senexi

답변

0

확인은, 당신은()에 가입 오버라이드 (override) 한, 당신은 그렇게 생각하지 않습니다. 주 스레드는 코드의 마지막 줄 바로 뒤에있는 주 스레드가 완료되면 각 스레드에서 join()을 호출합니다. telnet 스레드가 실제로 종료되기 전에 join() 메서드가 반환되기 때문에 Python은 혼란스럽고 join()을 다시 호출하려고 시도합니다. 이것이 100 % cpu 사용의 원인입니다. join() 메소드에 'print'문을 넣으십시오.

join() 구현은 소켓을 닫으려고합니다. (다른 스레드가 아직 연결을 시도하고있는 중일 수 있습니다.) 이것은 텔넷 스레드가 절대로 끝나지 않게하는 원인 일 수 있습니다.

+0

위대한, 당신은 절대적으로 조인 방법과 CPU 사용량에 대한했다. 고마워. 제가 오늘 발견 한 또 다른 문제는 연결하려고하는 두 개의 텔넷 장치의 잘못된 MAC 주소 구성이었습니다. 물론 이것은 또한 네트워크 동작이 제대로 작동하지 않는 결과를 낳았습니다. 나는이 문제가 해결되었다고 생각한다 ;-) – senexi