我认为Python进程在终止时调用其atexit函数。注意,我使用的是Python2.7。下面是一个简单的例子:
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类似,但它涉及到以信号结束的进程,而答案是拦截该信号。这个问题中的进程正优雅地退出,所以(据我所知)这个问题和答案不适用(除非这些进程由于某种信号而退出?)。
发布于 2014-10-20 23:28:00
我研究了一下在CPython中是如何实现的。这是假设您正在Unix上运行。如果您在Windows上运行,以下内容可能无效,因为multiprocessing中进程的实现不同。
结果是,os._exit()总是在流程结束时被调用。这一点,再加上退出文档中的以下说明,应该可以解释为什么您的lambda没有运行。
注意:当程序被Python不处理的信号杀死、检测到Python致命的内部错误或调用os._exit()时,通过该模块注册的函数不会被调用。
以下是用于分叉进程的Popen类CPython 2.7的摘录。注意,分叉进程的最后一条语句是对os._exit()的调用。
# 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不可用。
https://stackoverflow.com/questions/26452713
复制相似问题