2

我的 Python 应用程序中有几个守护线程。当我的主函数退出时,这些守护线程终止(如预期的那样)并且程序关闭。但我想要一种基本上“重新启动”我的程序而不退出并重新启动它的方法。有没有办法在不调用 sys.exit() 的情况下“强制关闭”我所有的守护线程?

4

1 回答 1

2

主要取决于您的需求。如果您想保存相同的类型并自动重新加载应用程序,这不是很困难,请看以下示例:

#!/usr/bin/env python

import sys, os, time

t = int(sys.argv[1])
print 'hello, I am', t
time.sleep(t)
if t > 2:
    sys.exit()
os.execl(sys.argv[0], sys.argv[0], str(t+1))

脚本在满足某个条件时自行重新启动,然后存在。您可以根据事件或信号重新启动应用程序,例如在SIGHUP.

如果你还需要保存当前状态,事情就更复杂了。您可以在重新启动之前将应用程序的状态保存在文件中,并在启动例程期间重新加载状态,或者您必须指示守护线程在特定条件下退出:

import threading, signal, time

should_restart = False
cond = threading.Event()
exit = threading.Event()
threads = []

def start(num=3):
    for i in range(num):
        t = threading.Thread(target=foo, args=[cond])
        threads.append(t)
        t.daemon = True
        print 'hello, I am', t.name
        t.start()

def restart(signum, frame):
    global should_restart
    should_restart = False
    cond.set()
    for thread in threads:
        thread.join()
        print 'bye bye', thread.name
    cond.clear()
    start()

def foo(should_exit):
    while not should_exit.is_set():
        time.sleep(0.2)

signal.signal(signal.SIGHUP, restart)
signal.signal(signal.SIGINT, lambda n, f: exit.set())
start()

while not exit.is_set():
    time.sleep(0.2)

我希望这两个示例对您有用,以更好地了解您的需求。

于 2013-01-25T17:29:05.043 回答