首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >atexit:如何手动触发它?

atexit:如何手动触发它?
EN

Stack Overflow用户
提问于 2019-08-24 06:54:45
回答 2查看 487关注 0票数 2

当我运行python脚本时,我可以退出解释器,atexit将执行我注册的所有函数。

现在,我正在使用airflow,并且想要触发atexit tasks on_kill() (即,当我清除或杀死airflow中的dag节点时)。

例如,在伪代码中,我需要能够:

代码语言:javascript
复制
class Foo(PythonOperator):
  ...
  def on_kill():
     # somehow, trigger atexit tasks without exiting the 
     # process entirely

atexit也不是必须的--我可以做其他的事情。主要的一点是,在python上下文之外执行的某些东西需要以过程方式终止,理想情况下,通过引用外壳脚本传递kill函数将是最后的手段(python不会使这种特殊的替代方案变得容易)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-08-24 09:28:51

你可以像猴子一样修补atexit模块--就像这样:

代码语言:javascript
复制
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)

输出:

代码语言:javascript
复制
Calling queued atexit functions:

func3(2, kwarg1=42, kwarg2='bar') called
func2(1) called
func1() called
票数 2
EN

Stack Overflow用户

发布于 2020-01-07 20:26:27

如果我没有误解您的问题,您可以通过atexit._run_exitfuncs()触发在atexit中注册的所有函数

代码语言:javascript
复制
import atexit


def do_something():
    print('I am doing some work')


def run_on_exit():
    print('I run on exit')


def do_something_else():
    print('I am doing more work')


if __name__ == '__main__':
    atexit.register(run_on_exit)
    do_something()
    atexit._run_exitfuncs()
    do_something_else()

输出显示,触发注册的exit函数不会停止程序流,但允许运行更多的函数。

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

https://stackoverflow.com/questions/57633815

复制
相关文章

相似问题

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