我有一些子进程(使用多进程),当它们停止时,每个子进程都需要做一些最后的工作。像下面这样的东西,虽然没有用......
import multiprocessing
import atexit
def final():
print "final work"
def worker():
print 'Doing some work'
atexit.register(final)
if __name__ == '__main__':
p = multiprocessing.Process(target=worker)
p.start()
p.join()
那我该怎么做呢?
最佳答案
通过 multiprocessing 启动的进程不会正常退出,并且永远不会调用 atexit
函数。您必须通过 try/finally block 手动运行清理内容,例如:
def worker():
try:
print('Doing some work')
finally:
final()
或者,如果你真的想使用 atexit
(缺点见下文):
def worker():
try:
print('Doing some work')
finally:
atexit._run_exitfuncs()
为什么子进程不能正常退出?
从技术上讲,因为 they quit via os._exit()
, 跳过任何清理作业(包括 atexit
函数、__del__()
和 weakref 终结器)。
此决定背后的原因是清理工作可能会在错误的时间、错误的过程中执行。大多数使用 atexit
(或其他机制)的代码都希望代码只执行一次,并且仅在主解释器退出时执行(例如,可以使用 atexit
来删除临时目录)。通过在每次子进程退出时执行 atexit
函数,您会打破这种预期,并且可能会发生不好的事情。
因此,即使您可以通过 atexit._run_exitfuncs()
运行 atexit
函数,也要避免这样做,因为该函数没有记录,而且您可能不是atexit
的唯一用户(其他第三方库可能会使用它,并且您可能会在他们的代码中引入错误)。
关于python - 如何在python的多处理子进程中注册 "atexit"函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34506638/