Python线程的生命周期
Python解释器的资源的申请和释放都由主线程完成
全局变量_PyRuntimeState中有一个字段_finalizing就是标记python解释器是否正在退出,这个字段在解释器初始化时被设置为null
当主线程要退出时(在Py_RunMain中调用Py_FinalizeEx,会开始主线程的退出流程),主线程会将_finalizing设置为自己
其它所有的线程在竞争获取GIL时,会首先检查_finalizing是否被设置了,若被设置,则马上放弃GIL的竞争并退出线程
这样在一段时间后,就只剩下主线程自己了
主线程会完成资源的释放工作。
要注意的是,Py_FinalizeEx可以在Py_RunMain外调用,其效果是释放所有python解释器的资源(而不影响所属的进程)
这个操作存在的意义在于:一些进程通过加装python的库的方式启动python,此时python并没有独立进程,此时python所属进程就可以通过Py_FinalizeEx释放Python的资源而不影响运行。