这是我第一次使用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()
答案 0 :(得分:2)
在你的线程方法中,建议使用“try ... except ... finally”。即使出现错误,此结构也可确保将控件返回到主线程。
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(第一列)。
答案 1 :(得分:0)
你的q挂了,因为你的工人有错误。所以你的q.task_done()永远不会被调用。
import threading
使用
print threading.current_thread().name