- blogs:
- cles::blog
« sshは続くよどこまでも :: 半世紀も経たないうちに遺産? »
2009/02/25

PythonでThreadを使う

最近Pythonでガリガリコーディングしているのですが、スレッドを使って平行に処理をしたい部分があったのでthreading.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 を使ってログインすることができます。
« sshは続くよどこまでも :: 半世紀も経たないうちに遺産? »
サイト内検索
検索ワードランキング
へぇが多いエントリ
閲覧数が多いエントリ
1 . アーロンチェアのポスチャーフィットを修理(114156)
2 . 福岡銀がデマの投稿者への刑事告訴を検討中(112719)
3 . 年次の人間ドックへ(112177)
4 . 2023 年分の確定申告完了!(1つめ)(111742)
5 . 三菱鉛筆がラミーを買収(111622)
2 . 福岡銀がデマの投稿者への刑事告訴を検討中(112719)
3 . 年次の人間ドックへ(112177)
4 . 2023 年分の確定申告完了!(1つめ)(111742)
5 . 三菱鉛筆がラミーを買収(111622)
cles::blogについて
Referrers