2017-04-17 5 views
0

私はforループが3つあります。 forループ内では、各アイテムに対して15個のスレッドが生成されます。これらはすべて私のGUIに戻ってデータを返しますが、何が起こるのかは、forループが実行され、3つの項目すべてが実行され、45スレッドが生成されます。最初の項目を実行しようとしていますが、15個のスレッドが完了するまで待ってから、2番目の項目を実行します。私は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

これは、アクティブなスレッドの数は(あなたがアクティブな他のスレッドを持っていないと仮定した場合)1にダウンしたときwhile Trueループを壊すことで簡単に解決することができます。

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

を試してみてくださいあなたが代わりにあなたが今持っている同じループ本体を使用しますが、

while threading.active_count() > 1: 
+0

にwhile条件を変更される可能性があります。また、小さな追加することを検討してください(25msのを?)あなたのを避けるために、whileループの中に眠りますGUIスレッドがあまりにも多くのCPU時間を消費する。 – holdenweb

+0

'except'部分を越えることに問題があるようです。新しい 'if'文を' print "Hello!" 'のような単純なものに置き換えても、それは印刷されません。 –

+0

あなたのコードにインデントを混同している可能性がありますが、例のコンテキストは実際には決定するほど大きくはありません。 'while'ループは' for'と同じレベルになければなりません。 'while'ループが実際に実行していると思われる' print'呼び出しを挿入してチェックしてください。 – holdenweb

関連する問題