首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >加入的Python进程不会调用atexit。

加入的Python进程不会调用atexit。
EN

Stack Overflow用户
提问于 2014-10-19 16:32:03
回答 1查看 1.4K关注 0票数 3

我认为Python进程在终止时调用其atexit函数。注意,我使用的是Python2.7。下面是一个简单的例子:

代码语言:javascript
复制
from __future__ import print_function
import atexit
from multiprocessing import Process


def test():
    atexit.register(lambda: print("atexit function ran"))

process = Process(target=test)
process.start()
process.join()

我希望它能打印出"atexit函数ran“,但它没有。

请注意,这个问题:Python进程不会调用atexit类似,但它涉及到以信号结束的进程,而答案是拦截该信号。这个问题中的进程正优雅地退出,所以(据我所知)这个问题和答案不适用(除非这些进程由于某种信号而退出?)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-20 23:28:00

我研究了一下在CPython中是如何实现的。这是假设您正在Unix上运行。如果您在Windows上运行,以下内容可能无效,因为multiprocessing中进程的实现不同。

结果是,os._exit()总是在流程结束时被调用。这一点,再加上退出文档中的以下说明,应该可以解释为什么您的lambda没有运行。

注意:当程序被Python不处理的信号杀死、检测到Python致命的内部错误或调用os._exit()时,通过该模块注册的函数不会被调用。

以下是用于分叉进程的Popen类CPython 2.7的摘录。注意,分叉进程的最后一条语句是对os._exit()的调用。

代码语言:javascript
复制
# Lib/multiprocessing/forking.py

class Popen(object):

    def __init__(self, process_obj):
        sys.stdout.flush()
        sys.stderr.flush()
        self.returncode = None

        self.pid = os.fork()
        if self.pid == 0:
            if 'random' in sys.modules:
                import random
                random.seed()
            code = process_obj._bootstrap()
            sys.stdout.flush()
            sys.stderr.flush()
            os._exit(code)

在Python3.4中,如果要启动分叉进程,os._exit()仍然存在,这是默认的。但似乎您可以更改它,请参阅上下文和启动方法获得更多信息。我还没有试过,但是也许使用一种开始的产卵方法会有效吗?但是Python2.7不可用。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26452713

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档