この記事では、Pythonのtime.sleep()メソッドについて説明します。
前回のチュートリアルでは、さまざまなタイミングタスクを実行するためのデフォルトのユーティリティライブラリであるtimeモジュールについて見てきました。
Pythonのtime.sleep()メソッドは、与えられた時間の間、現在のプログラム/スレッドの実行を停止するために使用されます。
現在のプログラム/スレッドは、この時間帯は基本的に何もしていないので、現在の状態から再開する前に、この時間だけ「スリープ」しています。
では、この関数の使い方を見てみましょう。
Python time.sleep() の使用法
この関数は time
モジュールの一部なので、time.sleep() のようにドット記法で呼び出します。
まず、time モジュールをインポートする必要があります。
import time
|
さて、プログラムの実行を停止させるには、引数として秒数を指定する必要があります。
import time
num_seconds = 5
print ( 'Going to sleep for' , str (num_seconds), 'seconds' )
time.sleep(num_seconds) print ( 'Woke up after' , str (num_seconds), 'seconds' )
|
結果は以下の通りです。
Going to sleep for 5 seconds
Woke up after 5 seconds
|
あなたのマシンで試してみると、2つの出力の間に5秒間、プログラムはスリープしているので、停止します。
秒数は浮動小数点数で指定することもできるので、0.001
秒(1ミリ秒)、0.0000001
秒(1マイクロ秒)の間でもスリープさせることができます。
こうすることで、浮動小数点数とクロックの精度の制限内で、可能な限り正確な遅延を実現することができます。
import time
num_millis = 2
print ( 'Going to sleep for' , str (num_millis), 'milliseconds' )
time.sleep(num_millis / 1000 )
print ( 'Woke up after' , str (num_millis), 'milliseconds' )
|
結果は以下の通りです。
Going to sleep for 2 milliseconds
Woke up after 2 milliseconds
|
スリープの正確な時間を測定するために、time.time()
メソッドを使ってタイマーをスタートさせることができます。
タイマーの開始値と終了値の差が実行時間になります。
それでは、上記のプログラムで実際にスリープしている時間を試してみましょう。
import time
num_millis = 2
print ( 'Going to sleep for' , str (num_millis), 'milliseconds' )
# Start timer start_time = time.time()
time.sleep(num_millis / 1000 )
# End timer end_time = time.time()
print ( 'Woke up after' , str (end_time - start_time), 'seconds' )
|
結果は以下の通りです。
Going to sleep for 2 milliseconds
Woke up after 0.0020711421966552734 seconds
|
ここで、時間はご覧の通り、正確に2ミリ秒ではありません。
約2.071`ミリ秒であり、それよりも若干大きい。
これは、オペレーティングシステムからのリソースの割り当てやプロセスのスケジューリングなどに何らかの遅延が発生するためで、若干の遅れが生じる可能性があります。
この遅延の程度は、特定のインスタンスにおけるオペレーティング・システムの正確な状態を知らないため、異なります。
time.sleep()の遅延時間の変数
何らかの理由で異なる遅延時間が必要な場合、time.sleep()
に変数を渡すことができます。
import time
delays = [ 1 , 1.5 , 2 ]
for delay in delays:
print ( 'Sleeping for' , delay, 'seconds' )
time.sleep(delay)
|
結果は以下の通りです。
Sleeping for 1 seconds
Sleeping for 1.5 seconds
Sleeping for 2 seconds
|
さて、ここまででtime.sleep()
の使い方を説明しましたが、同じことをスレッドに対しても行うことができます。
この記事もチェック:Pythonでtime.sleepメソッドを使って一定時間だけ待機状態にする方法
Python の time.sleep() をスレッドで使う
これはマルチスレッドの文脈で有用な関数です。
複数のスレッドが特定のリソースの解放を待つ必要がある場合があるからです。
以下のスニペットは、Pythonの time.sleep()
を使って、複数のスレッドを待機させ、出力を表示させる方法を示しています。
import time
from threading import Thread
class Worker(Thread):
# Entry point after thread.start() is invoked
def run( self ):
for i in range ( 4 ):
print ( 'Worker Thread' , i)
time.sleep(i + 1 )
class Waiter(Thread):
def run( self ):
for i in range ( 10 , 15 ):
print ( 'Waiter thread' , i)
time.sleep(i - 9 )
print ( 'Starting Worker Thread....' )
Worker().start() print ( 'Starting Waiter Thread....' )
Waiter().start() print ( 'Main thread finished!' )
|
結果は以下の通りです。
Starting Worker Thread.... Worker Thread 0
Starting Waiter Thread.... Waiter thread 10
Main thread finished! Worker Thread 1
Waiter thread 11
Worker Thread 2
Waiter thread 12
Worker Thread 3
Waiter thread 13
Waiter thread 14
|
ここで、メインスレッド(プログラム)の実行は、2つのスレッドの実行とは独立しています。
つまり、メインプログラムが先に終了し、その後に Worker
と Waiter
のスレッドが続きます。
まとめ
今回は、Pythonの time.sleep()
関数をいろいろと使ってみることを学びました。