Pythonのthreadingモジュールは簡単に使用できます


次のコードは『Pythonコアプログラミング』(第2版)から来ています.
threadingモジュールオブジェクト
説明
Thread
スレッドの実行を表すオブジェクト
Lock
ロック原語オブジェクト(threadモジュールのロック原語オブジェクトと同じ)
RLock
ロックされたオブジェクトを再読み込みできます.単一スレッドが取得したロック(再帰ロック)を再び取得できるようにする
Condition
条件変数オブジェクトは、1つのスレッドを停止させ、他のスレッドが「条件」を満たすのを待つことができます.例えば、状態の変化や変化に値する
Event
共通の条件変数で、複数のスレッドがイベントの発生を待つことができ、イベントの発生後、すべてのスレッドがアクティブになります.
Semaphore
待機ロックのスレッドに「待機室」のような構造を提供
BoundedSemaphore
Semaphoreと似ていますが、初期値を超えてはいけません.
Timer
Threadと似ていますが、実行を開始するまでしばらく待たなければなりません.
Threadクラスを使用すると、スレッドを作成する方法がいくつかあります.一般的には、次の3つの一般的な方法があります.
+Threadのインスタンスを作成し、関数に渡す
+呼び出し可能なクラスオブジェクトに渡すThreadインスタンスを作成する
+Threadからサブクラスが派生し、このサブクラスのインスタンスが作成されます.
# cat mtsleep3.py 
#!/usr/bin/env python

import threading
from time import sleep, ctime

loops = [4, 2]

def loop(nloop, nsec):
    print 'start loop', nloop, 'at:', ctime()
    sleep(nsec)
    print 'loop', nloop, 'done at:', ctime()

def main():
    print 'starting at:', ctime()
    threads = []
    nloops = range(len(loops))

    for i in nloops:
        t = threading.Thread(target=loop,
                   args=(i, loops[i]))
        threads.append(t)

    for i in nloops:
        threads[i].start()

    for i in nloops:
        threads[i].join()

    print 'all DONE at:', ctime()

if __name__ == '__main__':
    main()

すべてのスレッドが作成されたら、start()関数を呼び出して起動します.起動を作成するのではなく、一緒に起動します.また、ロックの山(割り当てロック、ロックの取得、ロックの解放、ロックの状態のチェックなど)を管理する必要はなく、単純にスレッドごとにjoin()関数を呼び出せばよい.join()関数は、スレッドが終了するまで待つか、timeoutパラメータが与えられたときにタイムアウトするまで待つ.
実行結果:
# python mtsleep3.py 
starting at: Wed Sep 23 09:12:48 2015
start loop 0 at: Wed Sep 23 09:12:48 2015
start loop 1 at: Wed Sep 23 09:12:48 2015
loop 1 done at: Wed Sep 23 09:12:50 2015
loop 0 done at: Wed Sep 23 09:12:52 2015
all DONE at: Wed Sep 23 09:12:52 2015