cod*_*nny 3 python signals module
我试图用Python来加快速度,尝试用它替换一些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)
Run Code Online (Sandbox Code Playgroud)
我的主代码有一个这样的循环:
signals.SignalSetup()
while signals.sigterm_caught == False:
sys.stdout.write("sigterm_caught=%s\n" % str(signals.sigterm_caught))
time.sleep(5)
Run Code Online (Sandbox Code Playgroud)
我运行它,然后终止进程,在signals.py内部获取信号,将sigterm_caught设置为True,但主进程中的循环没有看到sigterm_caught值的变化.
那么(a)我的方法是完全错误的Python方式?(b)我在尝试引用模块中的变量时做错了什么?(c)我应该以不同方式处理信号,例如提出例外吗?
另外:通过提出异常来处理信号会更好吗,还是我的旧C方法仍然是有效的?
您需要向global处理程序添加一个语句:
def SignalHandler(signum, stackframe):
global sigterm_caught
if signum == signal.SIGTERM:
sigterm_caught = True
sys.stdout.write("SIGTERM caught\n")
Run Code Online (Sandbox Code Playgroud)
默认情况下,如果函数分配给名称,Python编译器会认为每个名称(如sigterm_caught)都是函数的本地名称; 该global语句的作用是反转此默认值,以便Python编译器将该名称视为全局名称(即模块级顶级名称).