2012-05-23 2 views
0

OSC 라이브러리를 사용하고 있습니다. here입니다. 특정 msg를 받으면 sys.exit()을 통해 프로그램을 프로그래밍 방식으로 종료하고 싶습니다.osc lib 모듈에서 시스템 호출

나는 다음과 같은 것을 사용

oserve = OSC.OSCServer(('localhost', iportarg)) 
st = threading.Thread(target = oserve.serve_forever) 
oserve.addMsgHandler("/logout", logout_handle) 

def logout_handle(addr, tags, stuff, source): 
    sys.exit() 

발행 메시지 '/ 로그 아웃'다음과 같은 오류가 수율 :

OSCServer: SystemExit on request from localhost:55827:

사람이 그 이유 어떤 생각을 가지고 있습니까? thread-locked 된 하위 프로세스 내에 있습니까? OSC lib/모듈에서 아직 활성 상태 인 동안 시스템 프로세스를 발행 할 수없는 것처럼 보입니다. 어떤 아이디어는

덕분에, JML

답변

1

내가 다른 접근 방식을 제안 할 수 ... 좋을 done이 일 스레드를 살해 한 후 종료하여 True 다음 정리가 될 때까지 플래그 done=False 루프를 사용합니다.

from gevent import spawn 
from gevent.event import AsyncResult 
is_done = AsyncResult() 
oserve = OSC.OSCServer(('localhost', iportarg)) 
gl = gevent.spawn(oserve.oserve_forever) 
oserve.addMsgHandler("/logout", logout_handle) 

def logout_handle(): 
    global is_done 
    is_done.set(True) 

terminate_prog = False 
while not terminate_prog: 
    if is_done.ready(): 
     terminate_prog = True 


st.kill() 
sys.exit() 

이와 비슷한 것이 조금 더 바람직하며 리소스를 적절히 정리할 수 있습니다.

Greenlet이 통신 할 수있는 AsyncResult를 작성하면 주 비단 릿이 비동기 결과를 수신 할 준비가 될 때까지 반복되고 다른 비 니렛은 실행되는 후크가 있습니다. logout_handle 결국 주 신호 그린렛 끝내야 해.

+0

덕분에, lukecampell. 나는 이것을 나중에 보게 될 것이다. – jml

+0

hm; 이것은 나를 위해 작동하지 않습니다. 전역 있지만, 인식되지만 프로그램을 죽이는 is_done 변수의 조건을 만족시킬 수 없습니다. 다른 생각? – jml