Python线程挂起且无法关闭

3 投票
2 回答
6089 浏览
提问于 2025-04-19 04:59

这是我第一次在Python中尝试使用线程,我写了一个非常简单的程序。这个程序只是获取一个列表并使用一些线程打印出来。但是,每当出现错误时,程序在Ubuntu上就会卡住,我似乎无法做任何事情来恢复控制台,所以我不得不重新启动一个SSH会话才能重新进入。 我也不知道我的程序出了什么问题。有没有什么错误处理的方法可以让我确保程序不会卡住?还有,为什么ctrl/c不起作用(我没有中断键)?

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()

2 个回答

0

你的队列(q)卡住了,因为你的工作进程出错了。所以你的 q.task_done() 这个方法根本没有被调用。

import threading

要使用

print threading.current_thread().name
2

在你的线程方法中,建议使用“try ... except ... finally”这种结构。这个结构可以确保即使发生错误,也能把控制权返回给主线程。

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

另外,如果你想结束你的程序,可以先找到主线程的进程ID(pid),然后使用 kill #pid 来结束它。在Ubuntu或Mint系统中,可以使用 ps -Ao pid,cmd,在输出结果中,你可以通过查找你自己输入的命令(第二列)来找到进程ID(第一列)。

撰写回答