スレッドを使おう

Pythonでスレッドを使うためにはthread.start_new_threadか、threading.Threadを使います。まずはthread.start_new_threadバージョンです。引数で受け取った文字列を任意回表示して終了する関数を作り、スレッドに渡して実行してもらいます。

import time
import thread

def f(s, n):
  for i in range(n):
    print '%s-%d' % (s, i),
    time.sleep(0.01)

thread.start_new_thread(f, ('1', 20))
thread.start_new_thread(f, ('2', 20))
print 'end...!'

実行結果は以下のようになります。

end...!

スレッドが渡された関数を実行する前にメインスレッドが終了してしまうので最後の'end...!'しか表示されません。しかもthread.start_new_threadはjoinがなく、time.sleepで適当に待つしかないのでしょんぼりな感じです。というわけでthreading.Threadを使ってみます。

import time
import threading

def f(s, n):
  for i in range(n):
    print '%s-%d' % (s, i),
    time.sleep(0.01)

t1 = threading.Thread(target=f, args=('1', 150)) 
t2 = threading.Thread(target=f, args=('2', 50)) 

t1.start()
t2.start()
t1.join()
t2.join()
print 'end...!'

targetとargsで指定するのではなく、threading.Threadを継承したクラスを作り、__init__とrunをオーバーライドしてもいいみたいです。実行結果は以下のようになります。

1-0 1-1 ... 1-147 1-148 1-149 end...!

スレッドが終了するのを待ってから最後のprintが実行されていることがわかります。ちなみにthreading.Threadを使ってjoinをしないと次のような実行結果になりました。

1-0 1-1 2-0 end...!
1-2 2-1 1-3 ... 1-148 1-149 

処理はすぐにメインスレッドに戻ってしまうけど、スレッドは仕事を完遂するようです。