0

在我的代码中,我有这样的功能:

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_vars 的目的是防止多个实例同时运行。

atexit处理程序在程序被中断时工作正常,Ctrl-C但当它被系统或类似的东西杀死时不能。

我知道signal但它不允许取消处理程序。

我怎么做?或者如何改变结构来实现相同的功能?

4

1 回答 1

1

我想我想通了。

# 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_hereFalsemyfuncrunning

于 2015-01-28T14:15:56.253 回答