如何处理信号

时间:2017-05-20 20:40:47

标签: python operating-system signals

鉴于以下代码运行如下:

  • cli()解析一些配置文件
  • blabla()打印一条消息" hi!"
  • 这两个函数是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()

问题是:

  1. 为什么blabla()每次发送SIGUSR2信号时都会运行,因为只有信号处理程序才会调用cli()
  2. 如何才能实现cli()的运行(不调用blabla())?

1 个答案:

答案 0 :(得分:0)

Python doctime.sleep(secs)

  

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

因此,每次收到SIGUSR2时都不会调用blabla,但由于sleep中断,循环的另一次迭代会立即启动。