Python:关闭所有守护线程
我在我的Python应用程序中有几个守护线程。当我的主函数结束时,这些守护线程会自动结束(这是正常的),然后程序也会关闭。但是我想要一种方法,可以在不退出和重新启动程序的情况下,基本上“重启”我的程序。有办法在不调用sys.exit()的情况下“强制关闭”所有的守护线程吗?
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)
我希望这两个例子能帮助你更好地理解自己的需求。