Python 如何优雅地终止程序运行

简单来说,Python 优雅终止程序的核心就是“三件事:不要错过资源、理解状态码、能够处理多线程和信号”。

要扩展,最简单的方法是先使用 sys.exit() 。
我们去年运行的一个 3 000 级的小脚本直接以 sys.exit(0) 结束。
用过的人都会知道。
另一件事是引发 SystemExit 更加灵活。
例如,如果想在服务器程序退出之前杀掉进程并清除缓存,可以在最后写SystemExit(1 ),然后在catch之后进行清理。
很多人不重视这一点。
还有一个更重要的细节。
您必须使用 try...finally 来释放资源。
去年有一个项目,因为最后忘记关闭数据库连接。
结果,客户抱怨连接无法断开。
说实话,有点可惜。

一开始我以为多线程只能使用sys.exit(),后来发现不对。
当看到子线程没有响应时,应该是主线程stop_flag=True然后join()并等待退出。
去年,我们的一个爬虫项目就经历了这个陷阱。
至于信号处理,信号模块非常出色。
与SIGTERM一样,服务程序可以利用它来顺利重启。
例如,收到信号后,首先运行 gc.collect() 清理垃圾,然后退出。

警告:切勿使用 os._exit()。
这是暴力退出,不执行任何清理操作,尤其是文件描述符和锁。
去年我们的测试环境就因为这个卡了半天。

Python 中如何利用多线程在 sleep 期间执行其他任务?

这是一个坑。
使用 threading.Thread 启动后台任务。
daemon=true 防止主线程退出时子线程卡住。
使用定时器来实现周期性任务,但定时器不会自行重启。
使用while循环+sleep来控制定时器频率。
使用锁来解决线程安全问题。
对于 CPU 密集型应用程序,请使用多线程和多处理。
当主线程完成后,使用 join() 等待子线程。
不要使用计时器重复创建它,因为这会导致线程堆积。

实用提醒:使用join()或者守护线程来防止子线程意外退出。