2016-03-18 7 views
7

スレッディングの周りに頭を抱えようとしています。私のコードでは、1つのスレッドしか発射していないのですが、2番目のスレッドに直進すると思っています。私はロックや割り当てについて読んできましたが、あまり理解していません。同時に2つのスレッドを独立して動作させるためには、ここで何をする必要がありますか?スレッディングを理解する

import thread 

def myproc(item): 
    print("Thread fired for " + item) 
    while True: 
     pass 

things = ['thingone', 'thingtwo'] 

for thing in things: 
    try: 
     thread.start_new_thread(myproc(thing)) 

    except: 
     print("Error") 
+0

あなたは、あなたの質問に答えることができるように誰のため実際と予想される出力を表示する必要があります。 –

答えて

5

start_new_threadの署名が間違っています。 myprocを呼び出して、結果を引数としてstart_new_threadに渡していますが、これは発生しません。myprocは決して終了しません。

代わりに、それは次のようになります。

thread.start_new_thread(myproc, (thing,)) 

最初の引数は(関数を呼び出していない、すなわち関数オブジェクト。)関数であり、第二引数のタプルです。

を参照してください:あなたは、あなたのプログラムは、実際に両方のスレッドを開始したらhttps://docs.python.org/2/library/thread.html#thread.start_new_thread

は、おそらくスレッドが時にメインスレッドが終了を終了しますので、最後に一時停止を追加します。

また、threadモジュールの代わりにthreadingモジュールを使用することをお勧めします。これは、スレッドの実行が完了するまで待つ便利な方法など、より高級なインターフェイスを提供するためです。

参照:https://docs.python.org/2/library/threading.html#module-threading

+1

スレッドが何かを印刷する機会を得る前にスクリプトも終了します –

+0

問題の元のスクリプトは、スレッドを開始するまでは得られませんでした。しかし、はい、それは元の問題を修正するときの懸念です。 – SpoonMeiser

+0

賢い - それは理にかなっている! – user4893295

2

第二のスレッドが、私が言うことができるものから、終了する時間があった前に、あなたのアプリケーションが終了します。

#!/usr/bin/python 

import thread 
import time 

# Define a function for the thread 
def print_time(threadName, delay): 
    count = 0 
    while count < 5: 
     time.sleep(delay) 
     count += 1 
     print "%s: %s" % (threadName, time.ctime(time.time())) 

# Create two threads as follows 
try: 
    thread.start_new_thread(print_time, ("Thread-1", 2,)) 
    thread.start_new_thread(print_time, ("Thread-2", 4,)) 
except: 
    print "Error: unable to start thread" 

while 1: # This is a bad solution due to the busy wait loop. More below. 
    pass 

あなたができれスレッドオブジェクトを格納する必要があり、それを知らせるために終了する前に最後にthread1.join()thread2.join()を使用する:あなたはこのように、アプリケーションが終了する前に終了するには、スレッドの両方を待つ必要が

彼らはどちらも終了しました。

+0

これは便利です - スレッドでループを作成するときにスレッドを保存するにはどうしたらいいですか?どういうわけか、変数 'thing'をインスタンス名に入れる必要がありますか? – user4893295

+0

@ user4893295スレッドオブジェクトを格納する方法については、「スレッドモジュールを使用したスレッドの作成」の下のhttp://www.tutorialspoint.com/python/python_multithreading.htmを参照してください。 – Zolomon

関連する問題