18

モジュールスレッドとクラスを使用している場合Thread()、キャッチできませんSIGINT(コンソールではCtrl+ )キャッチできません。C

なぜそして何ができるのですか?

簡単なテストプログラム:

#!/usr/bin/env python

import threading

def test(suffix):
    while True:
        print "test", suffix

def main():
    for i in (1, 2, 3, 4, 5):
        threading.Thread(target=test, args=(i, )).start()

if __name__ == "__main__":
    main()

Ctrl+をC押しても、何も起こりません。

4

2 に答える 2

13

スレッドとシグナルは混ざりません。Pythonでは、これは外部よりもさらに当てはまります。シグナルは1つのスレッド(メインスレッド)にのみ配信されます。他のスレッドはメッセージを受け取りません。メインスレッド以外にスレッドを中断するためにできることは何もありません。彼らはあなたのコントロールの外にあります。

ここでできることは、queueモジュールを使用して、メインスレッドと開始するスレッドの間に通信チャネルを導入することだけです。次に、スレッドにメッセージを送信し、メッセージが表示されたときにスレッドを終了(またはその他の必要な処理)させることができます。

あるいは、スレッドを使用しないことは、多くの場合、非常に優れた代替手段です。ただし、代わりに何を使用するかは、達成しようとしていることによって大きく異なります。

于 2010-10-04T09:20:49.043 に答える
-1

基本的に、作業中にキューを読み取ることで、親がシグナルを発行したかどうかを確認できます。親がSIGINTを受信すると、キュー(この場合は何でも)を介してシグナルを発行し、子は作業を終了して終了します...

def fun(arg1, thread_no, queue):
   while True:
    WpORK...
    if queue.empty() is False or errors == 0:
     print('thread ', thread_no, ' exiting...')
     with open('output_%i' % thread_no, 'w') as f:
      for line in lines: f.write(line)
     exit()

threads = []
for i, item in enumerate(items):
 threads.append( dict() )
 q = queue.Queue()
 threads[i]['queue'] = q
 threads[i]['thread'] = threading.Thread(target=fun, args=(arg1, i, q))
 threads[i]['thread'].start()
try:
 time.sleep(10000)
except:
 for thread in threads:
  thread['queue'].put('TERMINATING')
于 2014-09-27T06:02:48.893 に答える