背景 链接到标题 最近在项目中使用到了 Gunicorn 的 Graceful Shutdown 功能,阅读代码学习一下 Gunicorn 的信号处理。
Master 链接到标题 Gunicorn 启动入口:
WSGIApplication("%(prog)s [OPTIONS] [APP_MODULE]").run() BaseApplication().run() Arbiter(self).run() Master 主要控制逻辑实现在 Arbiter 中,包括信号处理和主循环逻辑。在调用 Arbiter().run() 会最终调用到 Arbiter.init_signals() ,在该函数中会将 Master 中定义的需要处理的信号函数进行相应的注册:
Arbiter().run(): Arbiter().start() Arbiter().init_signals() # 初始化 Master 信号处理 # initialize all signals for s in self.SIGNALS: # "HUP QUIT INT TERM TTIN TTOU USR1 USR2 WINCH" signal.signal(s, self.signal) signal.signal(signal.SIGCHLD, self.handle_chld) 所有定义的信号处理函数都是 Aribiter().signal() ,该函数将接收到的信号存放在 Arbiter.SIG_QUEUE 中,最多保留 5 个信号,然后触发 Arbiter().wakeup() ,在 Arbiter().wakeup() 中,向 Arbiter.