2012-03-02 13 views
15

私はこのコードを持っている:複数のスレッドを使用する方法

私は10個のスレッドを作成したい
import thread 

def print_out(m1, m2): 
    print m1 
    print m2 
    print "\n" 

for num in range(0, 10): 
    thread.start_new_thread(print_out, ('a', 'b')) 

、各スレッドが機能print_outを実行するが、私は失敗しました。次のようにエラーがあります:すべての

Unhandled exception in thread started by 
sys.excepthook is missing 
lost sys.stderr 
Unhandled exception in thread started by 
sys.excepthook is missing 
lost sys.stderr 
Unhandled exception in thread started by 
sys.excepthook is missing 
lost sys.stderr 
Unhandled exception in thread started by 
sys.excepthook is missing 
lost sys.stderr 
Unhandled exception in thread started by 
sys.excepthook is missing 
lost sys.stderr 
Unhandled exception in thread started by 
sys.excepthook is missing 
lost sys.stderr 
Unhandled exception in thread started by 
sys.excepthook is missing 
lost sys.stderr 
Unhandled exception in thread started by 
sys.excepthook is missing 
lost sys.stderr 
Unhandled exception in thread started by 
sys.excepthook is missing 
lost sys.stderr 
Unhandled exception in thread started by 
sys.excepthook is missing 
lost sys.stderr 

答えて

12

まず、あなたはより高いレベルthreadingモジュール、具体的にThreadクラスを使用する必要があります。 threadモジュールは必要なものではありません。

このコードを拡張すると、スレッドが終了するのを待つこともできます。以下は、それを達成するためにjoinメソッドを使用する方法のデモンストレーションです:

import threading 

class print_out(threading.Thread): 

    def __init__ (self, m1, m2): 
     threading.Thread.__init__(self) 
     self.m1 = m1 
     self.m2 = m2 

    def run(self): 
     print self.m1 
     print self.m2 
     print "\n" 

threads = [] 
for num in range(0, 10): 
    thread = print_out('a', 'b') 
    thread.start() 
    threads.append(thread) 

for thread in threads: 
    thread.join() 
+0

'thread.join()'は、スレッドが終了するまで待機するために使用されます。スレッドのスレッド:thread.join() 'の最後の2行を追加しないと、プログラムもうまく実行され、すべてのスレッドが' thread.start() 'でデバッグに従って実行されることに気付きました私は 'time.time(0.1)'を追加しないと、 'thread.join()'というコードを追加する必要はありません。なぜなら、プログラムはスレッドを自動的に 'thread.start()'で終了させるからです。 – Searene

+0

@マーク 'time.sleep(0.1)'はまったく追加する必要はありません。それだけでは必要ありません。はい、 'join'を呼び出すコードを削除することができ、Python環境は実行を終了する前にすべてのスレッドが完了するのを待ちます。しかし、スレッドの実行を待つ方法を知っておく必要があると私は期待しているので、 'join 'への呼び出しを追加しました。しかし、この簡単な例では、 'join'への呼び出しを単に省略することができます。 –

2

あなたは、メインスレッドが少しの間生き続けるようにする必要があります。メインスレッドが終了すると、他のすべてのスレッドも同様に出力されることはありません。コードの最後にtime.sleep(0.1)を追加すると、出力が表示されます。

その後、thread.join()をご覧ください。これについて詳しく知りたい場合は、thread.join()をご覧ください。

2

もう1つのアプローチはスレッドクラスを使用することです。

instance[num]=threading.Thread(target=print_out, args=('a', 'b')) 

instance[num].start() 
関連する問題