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