退出时执行代码
Execute code at exit
在我的代码中我有这样的功能:
def myfunc():
# Don't do anything if there's an instance already
if get_var('running') == 'true':
return
set_var('running', 'true')
# In case things go wrong
atexit.register(set_var, 'running', 'false')
do_something()
do_something_else()
set_var('running', 'false')
# Unregister handler because nothing bad happened
atexit.unregister(set_var)
set_var
设置数据库中包含的变量。
所有这些 set_var
的目的是防止多个实例同时 运行。
atexit
处理程序在程序被 Ctrl-C 中断时工作正常,但当它被系统或类似的东西杀死时则不会。
我知道 signal
但它不允许取消处理程序。
我该怎么做?或者如何改变结构来实现相同的功能?
我想我明白了。
# Used to check if myfunc is running in current program
running_here = False
# Set 'running' variable inside database to 'false' if myfunc was running
# inside current program at the time of exiting or don't do anything otherwise
atexit.register(lambda: set_var('running', 'false') if running_here else None)
# Call atexit handler when SIGTERM is recieved by calling sys.exit
signal.signal(signal.SIGTERM, lambda x, frame: sys.exit(0))
def myfunc():
global running_here
# Don't do anything if there's an instance already
if get_var('running') == 'true':
return
# Don't let multiple instances to run at the same time
set_var('running', 'true')
running_here = True
do_something()
do_something_else()
# Allow other instances to run
set_var('running', 'false')
running_here = False
我需要做的只是制作一个不需要一遍又一遍取消的处理程序。
我通过添加全局变量 running_here
.
来做到这一点
当程序终止时,处理程序仅通过检查 running_here
来检查当前程序中的函数是否为 运行,如果是 True
,则处理程序仅设置变量 running
在数据库中 到 'false'
这样其他实例就不会启动。如果 running_here
是 False
这意味着 myfunc
不是 运行 并且不需要重置 running
变量所以它就退出了。
在我的代码中我有这样的功能:
def myfunc():
# Don't do anything if there's an instance already
if get_var('running') == 'true':
return
set_var('running', 'true')
# In case things go wrong
atexit.register(set_var, 'running', 'false')
do_something()
do_something_else()
set_var('running', 'false')
# Unregister handler because nothing bad happened
atexit.unregister(set_var)
set_var
设置数据库中包含的变量。
所有这些 set_var
的目的是防止多个实例同时 运行。
atexit
处理程序在程序被 Ctrl-C 中断时工作正常,但当它被系统或类似的东西杀死时则不会。
我知道 signal
但它不允许取消处理程序。
我该怎么做?或者如何改变结构来实现相同的功能?
我想我明白了。
# Used to check if myfunc is running in current program
running_here = False
# Set 'running' variable inside database to 'false' if myfunc was running
# inside current program at the time of exiting or don't do anything otherwise
atexit.register(lambda: set_var('running', 'false') if running_here else None)
# Call atexit handler when SIGTERM is recieved by calling sys.exit
signal.signal(signal.SIGTERM, lambda x, frame: sys.exit(0))
def myfunc():
global running_here
# Don't do anything if there's an instance already
if get_var('running') == 'true':
return
# Don't let multiple instances to run at the same time
set_var('running', 'true')
running_here = True
do_something()
do_something_else()
# Allow other instances to run
set_var('running', 'false')
running_here = False
我需要做的只是制作一个不需要一遍又一遍取消的处理程序。
我通过添加全局变量 running_here
.
当程序终止时,处理程序仅通过检查 running_here
来检查当前程序中的函数是否为 运行,如果是 True
,则处理程序仅设置变量 running
在数据库中 到 'false'
这样其他实例就不会启动。如果 running_here
是 False
这意味着 myfunc
不是 运行 并且不需要重置 running
变量所以它就退出了。