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 中,情况比在外部更是如此:信号只被传递到一个线程(主线程);其他线程不会收到消息。除了主线程之外,您无法中断其他线程。他们不在你的控制范围内。

您在这里唯一能做的就是使用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 回答