저는 파이썬으로 속도를 높이려고 노력 중이며, 일부 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
가) 함수에
지역 될 :
합니다. 감사. 파이썬 스코프에 대해 다시 읽는 것이 좋습니다. – codebunny
예외를 발생시켜 신호를 처리하는 것이 더 좋습니까? 아니면 전역 변수 메서드가 여전히 유효합니까? – codebunny
@codebunny, 예외적으로 "비동기 적으로"(즉, 실행중인 코드와 관련없는 외부 원인에서 발생하는) 유일한 예외는 'KeyboardInterrupt'입니다. 해당 예외 (또는 그 하위 클래스)를 통해 모든 신호를 퍼널링하는 것이 가능하지만, 가능한 경우, 귀하의 대안이 바람직합니다 (의견이 다를 수 있습니다 ;-). –