Python 如何处理信号

Python 如何处理信号,python,operating-system,signals,Python,Operating System,Signals,假设以下代码按如下方式运行: cli()解析一些配置文件 blabla()打印一条消息“嗨!” 这两个函数是main() cli()也是SIGUSR2 以下是片段: def cli(): parser = argparse.ArgumentParser() parser.add_argument("--logger-file", dest="logger_file", required=True, help="YAML logging configuration file")

假设以下代码按如下方式运行:

  • cli()
    解析一些配置文件
  • blabla()
    打印一条消息“嗨!”
  • 这两个函数是
    main()
  • cli()
    也是
    SIGUSR2
以下是片段:

def cli():
    parser = argparse.ArgumentParser()
    parser.add_argument("--logger-file", dest="logger_file", required=True, help="YAML logging configuration file")
    parser.add_argument("--conf-file", dest="conf_file", required=True, help="app configuration file")
    args = parser.parse_args()
    setup_logger(args.logger_file)
    commit_conf(args.conf_file)


def blabla():
    while True:
        logger.info("hi!")
        time.sleep(60)


def recv_sigusr2(signum, stack):
    cli()

def main():
    cli()
    signal.signal(signal.SIGUSR2, recv_sigusr2)
    blabla()


if __name__ == "__main__":
    main()
问题是:

  • 为什么每次我发送
    SIGUSR2
    信号时都运行
    blabla()
    ,因为只有信号处理程序才调用
    cli()
  • 如何只运行
    cli()
    (不调用
    blablabla()
    )呢
  • Python说的是时间。睡眠(秒):

    在给定的秒数内暂停当前线程的执行。参数可以是浮点数,以指示更精确的睡眠时间实际暂停时间可能小于请求的暂停时间,因为任何捕获到的信号都将在执行该信号的捕获例程后终止sleep()。此外,由于系统中其他活动的调度,暂停时间可能比请求的时间长任意数量

    因此,每次接收到SIGUSR2时不会调用
    blablabla
    ,但由于
    sleep
    中断,循环的另一次迭代会立即开始