Python:关闭所有守护程序线程

时间:2013-01-25 16:40:44

标签: python multithreading

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

1 个答案:

答案 0 :(得分: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))

脚本在满足某个条件时重新启动,然后 存在。您可以根据事件或a重新启动应用程序 信号,例如在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)

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