Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonのthreadingモジュール入門!Threadクラスの使い方とマルチスレッドの基本

Python 2.4以降に標準搭載されているthreadingモジュールは、旧来のthreadモジュールよりも強力で高レベルなスレッド操作機能を提供します。マルチスレッドプログラミングを行う際には、こちらのthreadingモジュールを使うのが一般的です。

threadingモジュールの主な関数

threadingモジュールは、threadモジュールのすべての機能を引き継ぎつつ、以下のような便利な関数を追加で提供しています。

  • threading.activeCount() ― 現在アクティブなスレッドオブジェクトの数を返します。
  • threading.currentThread() ― 現在実行中のスレッドオブジェクトを返します。
  • threading.enumerate() ― 現在アクティブなすべてのスレッドオブジェクトをリスト形式で返します。

Threadクラスの主要メソッド

threadingモジュールには、スレッド処理を実装するためのThreadクラスが用意されています。このクラスが提供する主なメソッドは以下のとおりです。

  • run() ― スレッドのエントリーポイント(処理の開始点)となるメソッドです。
  • start() ― run()メソッドを呼び出してスレッドを開始します。
  • join([time]) ― スレッドの終了を待機します。
  • isAlive() ― スレッドがまだ実行中かどうかを判定します。
  • getName() ― スレッドの名前を取得します。
  • setName() ― スレッドに名前を設定します。

threadingモジュールを使ったスレッドの作成手順

threadingモジュールで新しいスレッドを実装するには、次の3つのステップに従います。

  1. Threadクラスのサブクラスを定義する
  2. __init__(self [,args])メソッドをオーバーライドし、必要な引数を追加する
  3. run(self [,args])メソッドをオーバーライドし、スレッド開始時に実行したい処理を記述する

Threadクラスのサブクラスを作成したら、そのインスタンスを生成し、start()メソッドを呼び出すだけで新しいスレッドが起動します。start()は内部で自動的にrun()メソッドを呼び出す仕組みになっています。

サンプルコード

実際に2つのスレッドを生成し、並行して動作させる例を見てみましょう。

#!/usr/bin/python
import threading
import time

exitFlag = 0

class myThread (threading.Thread):
    def __init__(self, threadID, name, counter):
        threading.Thread.__init__(self)
        self.threadID = threadID
        self.name = name
        self.counter = counter
    def run(self):
        print "Starting " + self.name
        print_time(self.name, 5, self.counter)
        print "Exiting " + self.name

def print_time(threadName, counter, delay):
    while counter:
        if exitFlag:
            threadName.exit()
        time.sleep(delay)
        print "%s: %s" % (threadName, time.ctime(time.time()))
        counter -= 1

# 新しいスレッドを作成
thread1 = myThread(1, "Thread-1", 1)
thread2 = myThread(2, "Thread-2", 2)

# スレッドを開始
thread1.start()
thread2.start()

print "Exiting Main Thread"

Python 3で使う場合の注意点

上記のコードはPython 2系の構文で書かれています。Python 3ではprintが関数になったため、print("Starting " + self.name)のように括弧が必要です。また、activeCount()currentThread()isAlive()は、それぞれactive_count()current_thread()is_alive()という名称に変更されています(旧名称も互換性のため残されていますが、新規コードでは新しい名称の使用が推奨されます)。

実行結果

上記のコードを実行すると、次のような出力が得られます。

Starting Thread-1
Starting Thread-2
Exiting Main Thread
Thread-1: Thu Mar 21 09:10:03 2013
Thread-1: Thu Mar 21 09:10:04 2013
Thread-2: Thu Mar 21 09:10:04 2013
Thread-1: Thu Mar 21 09:10:05 2013
Thread-1: Thu Mar 21 09:10:06 2013
Thread-2: Thu Mar 21 09:10:06 2013
Thread-1: Thu Mar 21 09:10:07 2013
Exiting Thread-1
Thread-2: Thu Mar 21 09:10:08 2013
Thread-2: Thu Mar 21 09:10:10 2013
Thread-2: Thu Mar 21 09:10:12 2013
Exiting Thread-2

この出力から、Thread-1が1秒間隔で5回、Thread-2が2秒間隔で5回、それぞれ独立して並行処理されていることがわかります。メインスレッドは子スレッドの完了を待たずに先に終了していますが、join()メソッドを使えば、すべてのスレッドの終了を明示的に待つこともできます。

  1. Pythonのpydocモジュールを使ったドキュメント生成の完全ガイド

    はじめにpydocモジュールは、Pythonモジュールから自動的にドキュメントを生成するための標準ライブラリです。生成されたドキュメントは、コンソール上にテキストとして表示できるだけでなく、Webブラウザでの閲覧やHTMLファイルとしての保存にも対応しています。この記事では、さまざまな場面でドキュメントを確認する方法を解説するとともに、自分のPythonスクリプト用のドキュメントを作成する際に役立つdocstring(ドキュメンテーション文字列)についても詳しく学びます。それでは、pydocの具体的な使い方を見ていきましょう。準備:pydocのインポートpydocモジュールはPythonに最初

  2. Pythonのgetpassモジュールとは?パスワード入力とユーザー名取得の基本を解説

    Pythonの標準ライブラリには、ターミナル上で動作するアプリケーションにおいて、ユーザーの認証情報を検証してから処理を実行したい場合に役立つgetpassモジュールが用意されています。このモジュールには主に2つの関数が定義されており、セキュリティを意識したコマンドラインツールの開発に欠かせない存在です。 getpass() 関数:パスワードを安全に入力する getpass()関数は、ユーザーにパスワードの入力を促すための関数です。デフォルトでは、ターミナルに入力されたキーは画面に表示(エコー)されないため、第三者にパスワードを盗み見られる心配がありません。 また、プロンプトとして表示される