2011-06-03 12 views
3

任意の洞察力、私は以下のコードを持っていますが、キューが空になった後、それは上の住んでいる:私はスレッドを持っているだけで何もしないが立っているとして、それが何回も空のキューを印刷しスレッドの寿命をPythonで終わらせますか?

def processor(): 
    while(1>0): 
    if queue.empty() == True: 
    print "the Queue is empty!" 
    break 
    source=queue.get() 
    page = urllib2.urlopen(source) 
    print page 

def main: 
    for i in range(threads): 
    th = Thread(target=processor) 
    th.setDaemon(True) 
    th.start() 
    queue.join() 

。マックスが言ったように

+6

インデントを修正し、完全な例を投稿してください。 – NPE

答えて

4

あなたはそれ以外の参加、ページを印刷した後)(queue.task_doneを呼び出す必要があります()ブロックします。 get()を使用した後の各スレッドは、task_done()を呼び出す必要があります。

while(1>0): 
    if queue.empty() == True: 
    print "the Queue is empty!" 
    break 

以上が間違っ単なるです:

documentation for queue

+0

キューに作業が残っていないときにスレッドが終了した場合、task_done()を呼び出す必要なくスレッドに参加できます(キューではなく)。 –

1

は、あなたの行動を支援するために完全な例が必要ですが、ドキュメントから:

PythonのThreadクラスはJavaのThreadクラスの振る舞いのサブセットをサポート

。現在優先順位はなく、スレッドグループは存在せず、スレッドは破棄、停止、中断、再開、または中断できません。

run()メソッドが正常に終了した場合、または未処理の例外が発生した場合は、動作を停止します。 is_alive()メソッドは、スレッドが生きているかどうかをテストします。

http://docs.python.org/library/threading.html

低レベルのスレッドモジュール)は、手動で(出口を呼び出すことができません。より完全な例がなければ、私はそれがあなたがこの場合に必要なものかどうかはわかりませんが、run()が完了したらThreadオブジェクトが自動的に終了するはずではないと思われます。

http://docs.python.org/library/thread.html

+0

そして、Pythonでの推奨はマルチスレッドではなくマルチプロセッシングを使用することですが、少なくともI/O集約以外のタスクではそうではありませんか?グローバルインタープリタロックのために複数のスレッドが異なるプロセッサ上で実行されていても、複数のスレッドが同時に実行されることはないためです。私は彼がたくさんのI/O待ちを持つので、マックスにとっては関係ないと思う。 – JAB

+0

@JAB私が知る限り、それは正しいです。 – Jacinda

3

この部分を参照してください。 queue.get()がブロックしている場合は、絶対に理由がありません。busy loop削除する必要があります。

コードは次のようになります。

def processor(): 
    source=queue.get() 
    page = urllib2.urlopen(source) 
    print page 
    queue.task_done() 

def main: 
    for i in range(threads): 
    th = Thread(target=processor) 
    th.setDaemon(True) 
    th.start() 
    for source in all_sources: 
    queue.put(source) 
    queue.join() 

終了するのが最もクリーンな方法ではありませんが、機能します。プロセッサスレッドはデーモンに設定されているため、プロセス全体が終了するとすぐにmainが終了します。

関連する問題