2017-04-17 173 views
0

我有一個for循環3項。在for循環內,我爲每個項目生成了15個線程。這些都將數據返回到我的GUI,但會發生什麼情況是執行for循環,所有3個項目並貫穿始終,並且會產生45個線程。我試圖運行第一個項目,等到15個線程完成,然後運行第二個項目。我需要做所有這些,而不使用join()隊列阻塞主線程

我想這可以通過queue完成,但有阻塞的問題。當我嘗試以下,它永遠不會移動到第二組的15個線程:

while True: 
    try: 
     data = q.get(False) 
    except Query.Empty(): 
     data = None 

這將停止阻塞問題,使我的GUI與每個15個線程執行的功能不斷更新,但一旦他們執行,它只是結束並且不會繼續for循環。這是有問題的循環:

def thing_1(names): 
    def thready(): 
     print "Hello!" 
     q.put("Done") 
    for name in names: 
     print "Working on " + name 
     t1 = threading.Thread(target=thready) 
     t1.start() 
     # Then put 'while True' here 

回答

0

這可以很容易地通過打破while True循環來解決,當活動線程的數量下降到1(假設你沒有任何其他線程激活)。嘗試

while True: 
    try: 
     data = q.get(False) 
    except Query.Empty(): 
     data = None 
    if threading.active_count() == 1: 
     break 

您可能會改用你現在有相同的循環體,但改變而條件

while threading.active_count() > 1: 
+0

你也可以考慮增加一個小的(25毫秒?)睡眠進入while循環,以避免您的GUI線程佔用了太多的CPU時間。 – holdenweb

+0

似乎是超越'except'部分的問題。如果我用'print'Hello'''替換新的if語句,它甚至不會打印。 –

+0

聽起來可能你已經在你的代碼中混淆了縮進,但是示例上下文並不足以決定。 while循環應該和上面的for循環相同。通過插入'print'調用來檢查while循環實際上是否按照您的想法運行。 – holdenweb