簡體   English   中英

Python線程掛起並且不關閉

[英]Python threads hang and don't close

這是我第一次使用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()

在你的線程方法中,建議使用“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 ,您可以通過搜索自己鍵入的命令(第二列)來查找pid(第一列)以運行Python腳本。

你的q掛了,因為你的工人是錯誤的。 所以你的q.task_done()永遠不會被調用。

import threading

使用

print threading.current_thread().name

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM