Pythonのtime.sleepメソッドを使って一定時間だけ処理を止める方法

スポンサーリンク

この記事では、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() を使って、複数のスレッドを待機させ、出力を表示させる方法を示しています。

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つのスレッドの実行とは独立しています。

つまり、メインプログラムが先に終了し、その後に WorkerWaiter のスレッドが続きます。


まとめ

今回は、Pythonの time.sleep() 関数をいろいろと使ってみることを学びました。

タイトルとURLをコピーしました