2012-03-21 5 views
2

데몬 스레드가 실행 중인지 테스트하기가 까다로운 문제가 있습니다. 내가 만든 데몬 스레드는 서비스 실행을 유지하는 배경에서 실행해야합니다, 그래서 그것을 만들고 그것을 살아있는 유지하기 위해 다음을 수행하십시오파이썬 멀티 스레딩 : 데몬 스레드를 계속 실행하는 방법

창조 :

다음 initAirserv() 방법 내부

ASThread = threading.Thread(target = initAirserv, args=[],) 
ASThread.setDaemon(True) 
ASThread.start() 

def initAirserv(self, channel="15"): 
     interface = self.execAirmon(options="start", interface=self.interface) 
     port = self.plug_port 
     if interface != "removed": 
      if channel=="15": 
       command = "airserv-ng -d " +str(interface)+" -p "+str(port) 
      else: 
       command = "airserv-ng -d " +str(interface)+" -p "+str(port)+" -c"+str(channel) 
     else: 
      return None 
     AServConn=self.init_Plug() 
     if AServConn: 
      (stdin, stdout, stderr) = AServConn.exec_command(command) 
      serv_op = stdout 
      serv_er = stderr 
      ##### keep the daemon thread run persistently #### 
      a = 0 
      while 1: 
       a += 1 
     else: 
      logging.debug("SSH Error") 

마지막 몇 줄의 목적은 바보 같은 방법으로 스레드를 바쁘게 유지하는 것입니다. 그러나,이 데몬 스레드를 시작하고 내가 돌아 왔을 때 나는 다른 무언가를하고 다음과 같이 스레드를 확인 후 : 몸이 실행되지 없구요

if ASThread.is_alive() == 1: 
    # do something 

합니다. 누군가 왜 내게 설명 할 수 있을까요? 항상 바쁠 필요가있는 것을 실행하는 스레드를 실행하는 가장 좋은 방법은 무엇입니까? 매우 감사합니다.

답변

2

게시 된 코드가 추가되지 않습니다. 게시 된 initAirserv은 (는) 클래스의 메서드이지만 Thread 생성자에 전달 된 initAirserv은 그렇지 않습니다.

execAirmoninit_Plug이 무엇인지 알지 못하고 구체적인 내용을 말하기가 어려우며 응용 프로그램에서 어떤 일이 발생합니까?

일반적으로 나는 그것이 맞다고 말하고 싶습니다. 이것은 효과가있다. 귀하의 가정이 잘못되었다는 것을 의미하지 않는다는 사실.

  • execAirmon은 "제거 된"것과 같지 않은 것을 반환합니까?
  • 확실한가요 init_Plug false가 아닌 개체를 반환합니까?
  • 예외가 발생하지 않았습니까? (나는 당신이 가짜 stacktrace를 알아 차렸을 것이라고 생각하고, 그래서 주목받지 못한 것들을 삼킬 수있는 어플리케이션의 다른 부분이 있습니까?)
0

내 정보 중 일부는 몇 개월 된 것으로 변경 될 수 있으므로 알려 주시기 바랍니다.

표준 C 기반 Python을 사용하고 있고 멀티 스레드 응용 프로그램을 작성하는 경우 GIL (Global Interpreter Lock) 제한을 알고 있어야합니다. 즉, 한 번에 하나의 스레드 만 실행할 수 있습니다. 파이썬 C 인터페이스 패키지 중 하나를 사용하고 C로 많은 코드를 작성하고자한다면 함수 호출의 C 부분을 스레드 할 수 있으며 GIL 제한의 적용을받지 않습니다.

파이썬에는 우수한 다중 프로세스 지원 및 라이브러리가 있으며 프로세스를 동기화하므로 GIL 제한이 적용되지 않습니다.

GIL 제한을 수정하는 방법에 대한 이야기가 있지만 지금은 받아 들여야 할 문제입니다.

IMHO, 저는 매우 구체적인 문제가 해결되지 않는 한 Python으로 파이썬으로 소프트웨어를 작성했습니다. C로 작성하지 않았습니다. 파이썬은 많은 것들을위한 훌륭한 언어이지만 GIL 제한은 더 나은 이벤트 동기화, 일명 멀티 스레드 환경을 지원하는 언어를 배우도록 권장했습니다.

이 정보가 도움이되기를 바랍니다.

+0

감사합니다. GIL이 동일한 프로세스를 위해 여러 스레드에 적용되기 때문에 제 방식대로하지 말 것을 제안합니까? –

+0

필자는 절대로 파이썬 전문가는 아닙니다. 나는 단지 GIL 제한을 파고들 것을 제안합니다. GIL 제한 사항은 지난 한 해 동안 Boston Python Meetup에서 논의되었으므로 그 이후로 상황이 변경되었을 수 있습니다. 나는 더 이상 그것에 대해 조사하지 않았다. 나는 좋은 언어이고 많은 지원을하기 때문에 여전히 많은 것을 위해 파이썬을 사용한다. – octopusgrabbus

+0

이것이 OP의 질문에 어떻게 대답하는지 분명하지 않습니다. –