11

ネットワーク ソケットをリッスンするスレッドを実行する必要がある Python スクリプトを作成しています。

以下のコードを使用してCtrl+を使用してそれを殺すのに問題があります:c

#!/usr/bin/python

import signal, sys, threading

THREADS = []

def handler(signal, frame):
    global THREADS
    print "Ctrl-C.... Exiting"
    for t in THREADS:
        t.alive = False
    sys.exit(0)

class thread(threading.Thread):
    def __init__(self):
        self.alive = True
        threading.Thread.__init__(self)


    def run(self):
        while self.alive:
            # do something
            pass

def main():
    global THREADS
    t = thread()
    t.start()
    THREADS.append(t)

if __name__ == '__main__':
    signal.signal(signal.SIGINT, handler)
    main()

Ctrl+をキャッチcしてスクリプトを終了する方法についてアドバイスをいただければ幸いです。

4

2 に答える 2

10

問題は、実行がメインスレッドから落ちた後 (main()返された後)、threadingモジュールが一時停止し、ロックを使用して他のスレッドが終了するのを待つことです。ロックはシグナルで中断できません。これは、少なくとも Python 2.x の場合です。

select.select(). _ メインスレッドで何もする必要がない場合は、signal.pause(). 例:

if __name__ == '__main__':
    signal.signal(signal.SIGINT, handler)
    main()
    while True:           # added
        signal.pause()    # added
于 2013-10-29T08:11:36.677 に答える
5

これは、シグナルをキャッチできるのはメイン スレッドだけだからです。そして、ここでメインスレッドはずっと前に彼の人生を終えました(アプリケーションはあなたのスレッドが終了するのを待っています)。追加してみる

while True: 
    sleep(1)

あなたの最後までmain()(そしてもちろんfrom time import sleep一番上に)。

またはケビンが言ったように:

for t in THREADS:
    t.join(1) # join with timeout. Without timeout signal cannot be caught.
于 2013-10-29T08:11:24.467 に答える