需要了解Python信号和模块

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方法仍然是有效的?

Ale*_*lli 8

您需要向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编译器将该名称视为全局名称(即模块级顶级名称).