2009-03-13 6 views
13

가끔 중단되는 함수가 있습니다. 일반적으로 알람을 설정하지만 Windows에서 작동하지 않습니다. 이 문제를 해결하는 간단한 방법이 있습니까? 아니면 그냥 time.sleep()을 호출하는 스레드를 만들어야합니까?Windows에서 signal.alarm 대체 [파이썬]


스레드로 종료되었습니다. 만 트릭은 os._exit 대신

import os 
import time 
import threading 

class Alarm (threading.Thread): 
    def __init__ (self, timeout): 
     threading.Thread.__init__ (self) 
     self.timeout = timeout 
     self.setDaemon (True) 
    def run (self): 
     time.sleep (self.timeout) 
     os._exit (1) 

alarm = Alarm (4) 
alarm.start() 
time.sleep (2) 
del alarm 
print 'yup' 

alarm = Alarm (4) 
alarm.start() 
time.sleep (8) 
del alarm 
print 'nope' # we don't make it this far 
+2

os._exit를 사용했다? – ThiefMaster

+1

대신 [threading.Timer()'를 사용할 수 있습니다] (http://stackoverflow.com/a/28081214/4279) – jfs

+1

@ThiefMaster done! – LondonRob

답변

2

당신은 할 수 sys.exit의 사용했다 - 당신이 언급 한 바와 같이 - 단 몇 초의 수에자는 새 스레드를 킥오프.

또는 Windows의 멀티미디어 타이머 중 하나 (Python에서는 windll.winmm에 있음)를 사용할 수 있습니다. 나는 당신이 찾고있는 것입니다 timeSetEvent 믿습니다. 덧붙여서, 나는 그것을 사용하는 코드 조각을 발견했다 here.

3

가장 강력한 솔루션은 하위 프로세스를 사용한 다음 해당 하위 프로세스를 종료하는 것입니다. Python2.6은 subprocess.Popen()에 .kill()을 추가합니다.

귀하의 스레드 방식이 예상대로 작동하지 않는다고 생각합니다. Thread 객체에 대한 참조를 삭제해도 스레드는 죽지 않습니다. 대신 스레드가 깨어 난 후에 스레드가 확인하는 속성을 설정해야합니다.

스레드로가는 종료 :

+0

당신은'.kill()'을 사용하여 특정 시간 후에 교수형 함수를 처리하는 방법을 명확히 할 수 있습니까? –

+0

Rhamphoryncus :이 경우 스레드 참조를 삭제하는 것에 대한 귀하의 요점은 다소 의의가 있다고 생각합니다. 'threading.Thread' 서브 클래스의'run()'메소드가하는 마지막 작업은'os._exit()'를 호출하는 것입니다. 그렇지 않은 경우에도 메소드는 끝나서 효과적으로 "종료"됩니다. 최악의 경우 '델 알람'은 불필요합니다. – martineau

3

여기에 원래 포스터가 자신의 문제를 해결하는 방법입니다. 만 트릭은 당신이 * 당신 * 질문에서 답을 제거하고 ... 실제 * 답변 *로 게시하시기 바랍니다 수 대신 sys.exit

import os 
import time 
import threading 

class Alarm (threading.Thread): 
    def __init__ (self, timeout): 
     threading.Thread.__init__ (self) 
     self.timeout = timeout 
     self.setDaemon (True) 
    def run (self): 
     time.sleep (self.timeout) 
     os._exit (1) 

alarm = Alarm (4) 
alarm.start() 
time.sleep (2) 
del alarm 
print 'yup' 

alarm = Alarm (4) 
alarm.start() 
time.sleep (8) 
del alarm 
print 'nope' # we don't make it this far