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)

これらの 2 つの例が、ニーズをよりよく理解するのに役立つことを願っています。

于 2013-01-25T17:29:05.043 に答える