BLOGTIMES
2009/02/25

PythonでThreadを使う

  python 
このエントリーをはてなブックマークに追加

最近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が必要です→https://blog.cles.jp/item/2939
    Trackbacks
    このエントリにトラックバックはありません
    Comments
    愛のあるツッコミをお気軽にどうぞ。[policy]
    古いエントリについてはコメント制御しているため、即時に反映されないことがあります。
    コメントはありません
    Comments Form

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

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

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