Pythonで新しいスレッドを開始する方法【thread.start_new_threadの使い方】
Pythonで別のスレッドを新しく生成(スポーン)するには、threadモジュールが提供している次のメソッドを呼び出します。
thread.start_new_thread ( function, args[, kwargs] )
このメソッドを呼び出すことで、LinuxでもWindowsでも、高速かつ効率的に新しいスレッドを作成できます。
このメソッドは呼び出し後すぐに制御を返し、その裏で子スレッドが起動して、渡された引数argsを使ってfunctionを実行します。関数の処理が完了して戻り値を返すと、そのスレッドは自動的に終了します。
各引数の意味は以下の通りです。
- function: スレッドで実行したい関数
- args: 関数に渡す引数のタプル。引数なしで呼び出す場合は空のタプル
()を指定します - kwargs: キーワード引数の辞書(任意・省略可能)
サンプルコード
次の例では、2つのスレッドを生成し、それぞれ異なる間隔で現在時刻を表示します。
#!/usr/bin/python
import thread
import time
# スレッド用の関数を定義
def print_time( threadName, delay):
count = 0
while count < 5:
time.sleep(delay)
count += 1
print "%s: %s" % ( threadName, time.ctime(time.time()) )
# 2つのスレッドを作成
try:
thread.start_new_thread( print_time, ("Thread-1", 2, ) )
thread.start_new_thread( print_time, ("Thread-2", 4, ) )
except:
print "Error: unable to start thread"
while 1:
pass
実行結果
上記のコードを実行すると、次のような出力が得られます。
Thread-1: Thu Jan 22 15:42:17 2009 Thread-1: Thu Jan 22 15:42:19 2009 Thread-2: Thu Jan 22 15:42:19 2009 Thread-1: Thu Jan 22 15:42:21 2009 Thread-2: Thu Jan 22 15:42:23 2009 Thread-1: Thu Jan 22 15:42:23 2009 Thread-1: Thu Jan 22 15:42:25 2009 Thread-2: Thu Jan 22 15:42:27 2009 Thread-2: Thu Jan 22 15:42:31 2009 Thread-2: Thu Jan 22 15:42:35 2009
このように、Thread-1は2秒ごと、Thread-2は4秒ごとに時刻を出力しながら並行して動作していることが確認できます。
threadモジュールの注意点
threadモジュールは低レベルのスレッド処理には非常に有効ですが、より新しいthreadingモジュールと比較すると、提供されている機能がかなり限られている点に注意が必要です。
また、threadモジュールはPython 2向けのものです。Python 3では_threadという名前に変更されており、実際の開発では、同期機能やスレッド管理など高レベルなAPIを備えたthreadingモジュールを使用することが強く推奨されています。
-
PythonのTkinterでスレッドを使う方法|threadingモジュールによる非同期処理の基本
Tkinterでは、スレッド(Threading)を活用することで、複数の関数を同時に実行できます。これにより、アプリケーション内の処理を非同期で動かすことが可能になります。 Pythonでスレッドを使用するには、まずthreadingモジュールをインポートし、そのThreadクラスを継承した新しいクラスを定義します。そして、クラス内でrunメソッドをオーバーライドし、実行したい処理をその中に記述します。 つまり、スレッドを使えば複数の作業を並行して進めることができます。Tkinterアプリケーションでスレッドを実現する際は、Thread()関数を利用します。 ここでは、「一定時間スリープした
-
Pythonで二分木の葉から始まる辞書順最小の文字列を求める方法
問題概要二分木のルートノードが与えられます。各ノードには0から25までの値が格納されており、これらは文字「a」から「z」に対応しています。つまり、0は「a」、1は「b」というように対応付けられています。このとき、木の葉から始まってルートで終わるパスの中で、辞書順(lexicographical order)で最も小さい文字列を見つける必要があります。例えば、次のような木を考えてみましょう。この場合、パスの値の並びは [0, 3, 25] となるため、出力は adz になります。解法のアプローチこの問題はDFS(深さ優先探索)を使って解くことができます。以下の手順で進めます。DFS走査用のメソッ