BLOGTIMES
2009/02/25
[ by hsur at 16:12]

PythonでThreadを使う

  

最近Pythonでガリガリコーディングしているのですが、スレッドを使って平行に処理をしたい部分があったのでthreading.Threadを使ってみることにしました。

15.3.6 Thread オブジェクト

クラス Thread( group=None, target=None, name=None, args=(), kwargs={})

コンストラクタは常にキーワード引数を使って呼び出さねばなりません。 各引数は以下の通りです:
group はNone にせねばなりません。 将来ThreadGroup クラスが実装されたときの拡張用に予約されている 引数です。
target はrun() メソッドによって起動される 呼出し可能オブジェクトです。 デフォルトでは何も呼び出さないことを示す None になっています。
nameはスレッドの名前です。デフォルトでは、 N を小さな 10 進数として、Thread-N という形式の一意な名前を生成します。
args はtarget を呼び出すときの引数タプルです。デフォルトは()です。
kwargs はtarget を呼び出すときのキーワード引数の辞書です。デフォルトは{}です。
サブクラスでコンストラクタをオーバライドした場合、必ずスレッドが何かを始める前に基底クラスのコンストラクタ (Thread.__init__()) を呼び出しておかなくてはなりません。

コンストラクタのtargetは呼出し可能オブジェクトでなければならないと書いてあるのですが、Pythonのことをよく理解していなかったため、その意味が分からずにちょっとはまってしまいましたが、オブジェクトに__call__()というメソッドを追加して事なきを得ました。

コードの例

カウンターをスレッドで複数起動して、最後にThreadの終了を待つというサンプルを書いてみました。いろいろと応用ができそうです。

ThreadSample.py

# -*- coding: utf-8 -*-

import logging
import logging.config
from threading import Thread
import time

class Countdown:
    def __call__(self, name, count):
        while True:
            print name, count
            time.sleep(3)
            count -= 1
            if count < 0:
                break

threadCount = 5
counterStart = 5
threads = []

while True:
    cd = Countdown()
    th = Thread(name=None, target=cd, args=("Thread-%s\t" % threadCount, counterStart) )
    th.start()
    threads.append(th)
    threadCount -= 1
    if threadCount < 0:
        break
    time.sleep(1)

print "Waiting..."

for thread in threads:
    thread.join()

print "Done!"

実行結果

Thread-5        5
Thread-4        5
Thread-3        5
Thread-5        4
Thread-2        5
Thread-4        4
Thread-1        5
Thread-3        4
Waiting...
Thread-0        5
Thread-2        4
Thread-5        3
Thread-4        3
Thread-1        4
Thread-3        3
Thread-0        4
Thread-2        3
Thread-5        2
Thread-4        2
Thread-1        3
Thread-3        2
Thread-0        3
Thread-2        2
Thread-5        1
Thread-4        1
Thread-1        2
Thread-3        1
Thread-0        2
Thread-2        1
Thread-5        0
Thread-4        0
Thread-1        1
Thread-3        0
Thread-0        1
Thread-2        0
Thread-1        0
Thread-0        0
Done!
このエントリは役に立ちましたか?
トラックバックについて
Trackback URL:
お気軽にどうぞ。トラックバック前にポリシーをお読みください。[policy]
このエントリへのTrackbackにはこのURLが必要です→http://blog.cles.jp/item/2939
Trackbacks
このエントリにトラックバックはありません
Comments
愛のあるツッコミをお気軽にどうぞ。[policy]
古いエントリについてはコメント制御しているため、即時に反映されないことがあります。
コメントはありません
Comments Form

コメントは承認後の表示となります。
OpenIDでログインすると、即時に公開されます。

OpenID を使ってログインすることができます。

Identity URL: Yahoo! JAPAN IDでログイン

Web Services by Yahoo! JAPANPowered by NP_SpamBayesJP
★下記に2つの英単語をスペースで区切って入力してください