Python线程挂起并不关闭

问题描述:

这是我第一次尝试使用Python中的线程, 我写了下面的程序作为一个非常简单的例子。它只是获取一个列表并使用一些线程打印它。但是,只要出现错误,程序就会在Ubuntu中挂起,我似乎无法做任何事情来获取控制提示,因此必须重新启动另一个SSH会话才能重新加入。 也不知道什么是问题与我的程序是。 是否有某种错误处理可以保证它不会挂起。 此外,任何想法,为什么CTRL/C不工作(我没有休息键)Python线程挂起并不关闭

from Queue import Queue 
from threading import Thread 
import HAInstances 
import logging 

log = logging.getLogger() 
logging.basicConfig() 

class GetHAInstances: 
    def oraHAInstanceData(self): 
     log.info('Getting HA instance routing data') 
     # HAData = SolrGetHAInstances.TalkToOracle.main() 
     HAData = HAInstances.main() 
     log.info('Query fetched ' + str(len(HAData)) + ' HA Instances to query') 
     # for row in HAData: 
     # print row 
     return(HAData) 

def do_stuff(q): 
    while True: 
    print q.get() 
    print threading.current_thread().name 
    q.task_done() 


oraHAInstances = GetHAInstances() 
mainHAData = oraHAInstances.oraHAInstanceData() 

q = Queue(maxsize=0) 
num_threads = 10 

for i in range(num_threads): 
    worker = Thread(target=do_stuff, args=(q,)) 
    worker.setDaemon(True) 
    worker.start() 

for row in mainHAData: 
    #print str(row[0]) + ':' + str(row[1]) + ':' + str(row[2]) + ':' + str(row[3])i 
    q.put((row[0],row[1],row[2],row[3])) 

q.join() 

在你的线程的方法,推荐使用“试试......除了......终于”。这种结构保证即使在发生错误时也能将控制返回到主线程。

def do_stuff(q): 
    while True: 
     try: 
      #do your works 
     except: 
      #log the error 
     finally: 
      q.task_done() 

此外,如果你想杀死你的程序,去找出你的主线程的PID和使用kill #pid杀死它。在Ubuntu或Mint中,在输出中使用ps -Ao pid,cmd,可以通过搜索您自己键入的命令(第二列)来运行Python脚本,找出pid(第一列)。

你q被挂,因为你的工人为出错。所以你的q.task_done()永远不会被调用。

import threading 

使用

print threading.current_thread().name