私の 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)
これらの 2 つの例が、ニーズをよりよく理解するのに役立つことを願っています。
于 2013-01-25T17:29:05.043 に答える