2011-08-16 37 views
1

スレッド/キューをPythonで使うつもりです。2.5.2 しかし、pythonはqueue.join()コマンドでフリーズしているようです。 followongコードの出力のみである:Pythonのスレッディング/キュー

import Queue 
import threading 

queue = Queue.Queue() 

class ThreadUrl(threading.Thread): 

    def __init__(self, queue): 
     threading.Thread.__init__(self) 
     self.queue = queue 

    def run(self): 
     while True: 

      i = self.queue.get() 
      print i 
      self.queue.task_done() 


def main(): 

    for i in range(5): 
     t = ThreadUrl(queue) 
     t.setDaemon(True) 
     t.start() 

    for i in range(5): 
     queue.put(i) 

    print "BEFORE" 
    queue.join() 
    print "AFTER" 


main() 

前には、間違っているものについて、誰かのアイデアを持って?

+0

queue.put(1)...これは解決策です。しかし、単にid(キュー)がすべての関数で同じであることを確認してください。関数内でグローバルキューを使用しないと... –

+0

これはWindows上のPython 2.6.6でうまく動作します –

+0

このコードはきれいに見えます\ –

答えて

0

ThreadUrlクラスのrun()メソッドがインデントされすぎています。スレッドは結果として決して開始されません。 runメソッドのインデントをのinit()と同じインデントレベルに設定すると、正常に動作します。私は今見つけ

+0

ヒントをありがとう。しかし、今、queue.put(i)-commandを呼び出した後、最初の(時には2番目の)時間Pythonがクラッシュします。 – MultiQueue

+0

どのようにクラッシュしますか?標準的な例外か、シグナル(SEGV)で死ぬ? – brandx

+0

IDLEがフリーズすると、タスクマネージャによってウィンドウが閉じられます。 – MultiQueue

0

解決策は以下のとおりです。

は、Python 2.5.2を使用しないでください! 代わりにPython 2.7.2を使用すると、上記のコードがうまく機能します。

ありがとうございました!

0

私はそれがt.setDaemon(True)の部分だと思います。

ので> 2.6

t.setDaemon(TRUE)

< 2.6

t.daemon =真

0

使用デーモン=真。これにより、メイン関数が実行されるとスレッドが確実に終了します。