Python线程挂起而不clos

2024-10-01 09:41:33 发布

您现在位置:Python中文网/ 问答频道 /正文

这是我第一次尝试用Python编写线程, 我写了下面的程序作为一个非常简单的例子。它只是得到一个列表并使用一些线程打印它。但是,每当出现错误时,程序就会挂在Ubuntu中,而我似乎不能做任何事情来恢复控制提示符,所以必须重新启动另一个SSH会话才能重新进入。 也不知道我的程序有什么问题。 是否有某种类型的错误处理可以确保它不会挂起。 还有,知道为什么ctrl/c不起作用吗(我没有break键)

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

Tags: infromimport程序logforqueuelogging
2条回答

你的q被吊死是因为你的工人出错了。所以你的q.task_done()从未被调用。在

import threading

使用

^{pr2}$

在你的线程方法中,建议使用“try。。。除了。。。最后”。这种结构保证即使发生错误也能将控件返回到主线程。在

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,在输出中,您可以通过搜索自己键入的命令(第二列)来找到pid(第一列),以运行Python脚本。在

相关问题 更多 >