当我运行python脚本时,我可以退出解释器,并且atexit
将执行我已注册的所有功能。
现在,我正在使用气流,并想触发atexit
任务on_kill()
(即当我清除或杀死气流中的dag节点时)。
例如,在伪代码中,我需要能够:
class Foo(PythonOperator):
...
def on_kill():
# somehow, trigger atexit tasks without exiting the
# process entirely
atexit
也不是必需的-我可以做其他事情。最主要的一点是,需要以程序方式杀死在python上下文之外执行的某些事情,并且理想情况下,通过参考外壳脚本传递kill函数将是最后的选择(python不会使这种特殊选择变得容易) 。 最佳答案
您可以猴子补丁atexit
模块,如下所示:
import atexit
from queue import LifoQueue
save_register = atexit.register
atexit_queue = LifoQueue()
def my_register(func, *args, **kwargs):
save_register(func, *args, **kwargs)
atexit_queue.put((func, args, kwargs))
atexit.register = my_register
if __name__ == '__main__':
def func1():
print('func1() called')
def func2(arg):
print(f'func2({arg}) called')
def func3(arg, kwarg1=1, kwarg2='foo'):
print(f'func3({arg}, kwarg1={kwarg1}, kwarg2={kwarg2!r}) called')
atexit.register(func1)
atexit.register(func2, 1)
atexit.register(func3, 2, kwarg1=42, kwarg2='bar')
print('Calling queued atexit functions:\n')
while atexit_queue.qsize():
func, args, kwargs = atexit_queue.get()
atexit.unregister(func) # Prevent it from being called again.
func(*args, **kwargs)
输出:
Calling queued atexit functions:
func3(2, kwarg1=42, kwarg2='bar') called
func2(1) called
func1() called
关于python - atexit:如何手动触发它?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57633815/