2010-10-28 25 views
3

我试图运行下面的代码(这我简化了一下):如何中断python多线程应用程序?

def RunTests(self): 
     from threading import Thread 
     import signal 

     global keep_running 
     keep_running = True 
     signal.signal(signal.SIGINT, stop_running) 

     for i in range(0, NumThreads): 
      thread = Thread(target = foo) 
      self._threads.append(thread) 
      thread.start() 

# wait for all threads to finish 
     for t in self._threads: 
      t.join() 

def stop_running(signl, frme): 
    global keep_testing 
    keep_testing = False 
    print "Interrupted by the Master. Good by!" 
    return 0 

def foo(self): 

    global keep_testing 

    while keep_testing: 
     DO_SOME_WORK(); 

我想到的是,用户按下CTRL + C程序将通过信息打印好和中断。但它不起作用。哪里有问题?

感谢

回答

3

与常规进程不同,Python似乎不以真正的异步方式处理信号。 'join()'调用以某种方式阻止主线程,阻止它响应信号。我有点惊讶,因为我没有看到文档中的任何内容表明这可以/应该发生。但是,解决方案很简单。在你的主线程中,在线程调用'join()'之前添加以下循环:

while keep_testing: 
    signal.pause() 
+1

非常感谢。我花了很多时间来解决这个问题。 – 2010-10-28 13:27:45

0

threading docs

线程可以被标记为“守护线程”。该标志的意义在于,只有守护线程都离开时,整个Python程序退出。初始值是从创建线程继承的。该标志可以通过守护进程属性设置。

在致电start()之前,您可以尝试设置thread.daemon = True并查看是否解决了您的问题。

相关问题