python - 如何在python的多处理子进程中注册 "atexit"函数?

标签 python multiprocess atexit

我有一些子进程(使用多进程),当它们停止时,每个子进程都需要做一些最后的工作。像下面这样的东西,虽然没有用......

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/

相关文章:

c - 使用 calloc() 设置 char 数组,完成后也是 "freeing"数组

python - 程序启动时执行的 Atexit 函数

python - 类型错误 : callback() takes exactly 2 arguments (0 given)

python - 在Pycharm中无法添加conda环境

c++ - OpenMP 不支持循环中断

java - 检测在多进程应用程序的主进程上运行的应用程序类

rust - 为什么 atexit 处理程序在访问 stdout 时会出现 panic ?

python - 分区 Redis 数据库

Python解密

c - 信号错误: "invalid use of void expression"