2010-03-24 4 views
3

저는 파이썬으로 속도를 높이려고 노력 중이며, 일부 C 코드로 대체하려고합니다. 모듈간에 데이터를 공유하는 데 문제가 있거나 전체를 이해할 가능성이 높습니다.파이썬 신호와 모듈을 이해해야합니다.

import sys, signal 

sigterm_caught = False 

def SignalHandler(signum, stackframe): 
    if signum == signal.SIGTERM: 
    sigterm_caught = True 
    sys.stdout.write("SIGTERM caught\n") 

def SignalSetup(): 
    signal.signal(signal.SIGTERM, SignalHandler) 

내 주요 코드는 다음과 같은 루프가 있습니다 :

signals.SignalSetup() 
while signals.sigterm_caught == False: 
    sys.stdout.write("sigterm_caught=%s\n" % str(signals.sigterm_caught)) 
    time.sleep(5) 

내가 다음 프로세스를 종료, 실행이 신호를 얻을 수 signals.py 내부를 나는 간단 신호 모듈이 있습니다 , sigterm_caught를 True로 설정하지만 주 프로세스의 루프는 sigterm_caught 값의 변경 사항을 보지 못합니다.

그래서 (a) 제 접근 방식이 파이썬 방식에 완전히 틀립니 까? (b) 모듈에서 변수를 참조하려고 할 때 잘못된 것이 있습니까? (c) 예외를 발생시키는 것과 같이 신호를 다르게 처리해야합니까?

추가 : 예외를 발생시켜 신호를 처리하는 것이 더 좋습니까, 아니면 이전 C 방식이 유효합니까? 이 기능 할당을 보이는 경우

파이썬 컴파일러는 기본적으로 각각의 이름을하다고

def SignalHandler(signum, stackframe): 
    global sigterm_caught 
    if signum == signal.SIGTERM: 
    sigterm_caught = True 
    sys.stdout.write("SIGTERM caught\n") 
이 (같은 sigterm_caught가) 함수에 지역 될 :

답변

7

당신은 핸들러에 global 문을 추가해야합니다 이름에; global 구문의 역할은이 기본값을 바꿔서 파이썬 컴파일러가 글로벌 (즉, 모듈 수준의 최상위 이름)으로 간주합니다.

+0

합니다. 감사. 파이썬 스코프에 대해 다시 읽는 것이 좋습니다. – codebunny

+0

예외를 발생시켜 신호를 처리하는 것이 더 좋습니까? 아니면 전역 변수 메서드가 여전히 유효합니까? – codebunny

+1

@codebunny, 예외적으로 "비동기 적으로"(즉, 실행중인 코드와 관련없는 외부 원인에서 발생하는) 유일한 예외는 'KeyboardInterrupt'입니다. 해당 예외 (또는 그 하위 클래스)를 통해 모든 신호를 퍼널링하는 것이 가능하지만, 가능한 경우, 귀하의 대안이 바람직합니다 (의견이 다를 수 있습니다 ;-). –

3

당신이 전역 변수에 쓰기 경우, 글로벌 사용 작동

sigterm_caught = False 

def SignalHandler(signum, stackframe): 
    global sigterm_caught 
    if signum == signal.SIGTERM: 
    sigterm_caught = True 
    sys.stdout.write("SIGTERM caught\n") 
+0

이 클래스 안에서 작동합니까? 나는 __init__에 'global self.variable'을 부여한 후 다른 메소드의 시그널 핸들러를 통해 self.variable에 설정된 값에 접근 할 수 없다. – Vivek

관련 문제