我在使用multiprocessing库创建进程的时候,发现了这么一个问题:
https://docs.python.org/3.5/library/multiprocessing.html#multiprocessing.Process中对于terminate函数的文档中说:
Note that exit handlers and finally clauses, etc., will not be executed.
exit handlers我姑且理解为上下文管理器的__exit__函数(不知道对不对)。
当我在主进程中调用terminate()结束子进程,会导致子进程的资源无法释放掉。
我想知道,如何在主进程里优雅的结束子进程?
在主进程里直接terminate子线程,是不推荐的做法,因为结束的时候不清楚子线程的运行状况,有很大可能性导致子线程在不恰当的时刻被结束。
在主进程里优雅的结束子进程,推荐的方法是,通过全局变量、互斥锁或信号量等进程间通信手段来达到。
例如,使用multiprocessing.Value对象,来传递信息。通知子线程:“辛苦了,你可以休息了”,然后让子线程自身决定退出的时刻,可以选择一个适当的时刻来结束任务。
下面的代码,在外部修改alive.value的值,子进程得知后,选择在没有sleep的时候退出。