Pythonのsleep関数とは
様々な分野で活躍するプログラミング言語のPythonですが、「sleep」という関数を知っているでしょうか。C言語やVBAでも同じ関数があり、似た使い方ができると期待する方もいれば、何をする関数か分からない方もいるでしょう。
本記事では、sleep関数のPythonにおける概要や使い方を説明すると共に、具体的な使用例やsleepに関わる発展的な情報も紹介していきます。
【参考】:sleep関数
関数の概要
まずは、Pythonにおけるsleep関数の概要を説明していきます。sleepは実行処理を指定された時間だけ一時停止させることができ、プログラム実行中に何もしない時間を作り出すことができます。
sleepは標準ライブラリの1つであるtimeモジュールをインポートするだけで使うことができるため、追加のライブラリをインストールする必要もありません。sleep関数は以下のように、引数に秒単位の待ち時間を指定することで動作します。
sleep(1)
また、以下のように小数点以下の数値を指定し、1秒未満でも待ち時間を指定できます。
sleep(0.1)
引数もはっきりしており処理もシンプルであるため、実際の利用にあたって不明な点が出てくることはあまりないでしょう。
精度はどの程度
Pythonは組み込みプログラムの分野でも使用することがあり、時間的な高精度が求められることがあります。そうした背景から、sleep関数の待ち時間の精度が気になる方もいるでしょう。
まず、sleep関数の引数が秒単位であることから、マイクロ秒レベルの精度は少なくとも保証できないことは容易に想像できます。では実際の精度はどの程度なのでしょうか。
sleep関数における時間の測定には、OSに搭載されているタイマーを利用しています。例えばWindowsでは、このOSのタイマーの精度は約15ms程度です。したがって、sleepでは15msより小さい単位での待ち時間を設定することはできません。
もちろんこの15msという数字も正確に刻めるわけではありませんので、15ms間隔で例えば150msなら正確に測れるわけでもないことには注意しましょう。
wait関数との違いは?
Pythonにはsleep関数と似た機能を持つ「wait関数」が存在します。こちらも指定された秒数だけ処理を止める機能を提供しています。
両者の違いはただ1つであり、wait関数は一時停止中には他の処理を実行できるのに対し、sleep関数は他の処理も停止させ、一切の動作をさせることができません。これは、シンプルなプログラムでは使い分ける必要はありませんが、複数の処理を並列で動かすマルチタスクプログラムでは大きな違いが出てきます。
他方の処理の途中で一旦停止させ、もう片方の処理をさせたいという場合には、このwait関数で待たせることをしないと、もう片方の処理が一切進められなくなってしまうためです。
sleep関数を使う場面
sleep関数の基本事項を解説してきましたが、実際にどのような場面で使用されるかイメージが付いていない方もいるでしょう。したがって、次にsleep関数を使用する場面を具体的に紹介します。
サーバアクセスの負荷低減
sleep関数の実行中は他の処理が一切行われないことを利用して、プログラムのアクセス先への負荷低減を行うことができます。もう少し具体的な例を考え、PythonでWebアプリを設計する際、スクレイピングなどで繰り返し外部へアクセスするような場面を例に挙げます。
指定された条件に合致するまで繰り返しアクセスを行う場合、sleep関数などで待ち時間を設定しなければ、プログラムは可能な限り高い頻度で外部サーバへアクセスしてしまいます。サーバ側もその頻度に合わせて応答をせざるを得ず、負荷は非常に高くなります。
よほど高い応答性を求めない限りは、sleep関数を実装し、アクセス頻度を指定間隔に制限することがいいでしょう。このようにプログラムの動作を抑制し、外部への負荷を下げるというメリットがあります。
ログの表示を見やすくする
Pythonのようなインタープリタ型ではコンパイルせずに、コードの一部分をデバッグすることもできます。動作結果のログもprintコマンドを実装すれば、簡単にIDE上で確認することもできます。
一方、処理内容に対してログが多いと、あっという間に画面がログで埋め尽くされて何を確認すればよいか分からなくなることもあります。そうした時にsleepを使えば、ログをじっくり確認しながらデバッグすることができます。
Webアプリなど外部との通信のやりとりをデバッグするような場面では、sleepであえて通信周期を延ばし、通信内容が正常かを見るような使い方が考えられます。
決められた周期で処理を実行する
決められた時間周期で処理を実行するような場合でもsleepは活用されます。
繰り返し処理の場合は、処理が終わるとすぐに次の処理を繰り返してしまいますが、決められた時間間隔で処理をさせたい時もあるでしょう。また、延々と一定間隔で同じ処理をさせたい場合も考えられます。そういった時にsleepは活躍します。
意図的な周期を作りたい時には、sleep関数で待ち時間を指定し、処理の最後に記述すればよいでしょう。注意点として、ミリ秒単位の精度で周期を守らせたい場合には、精度の問題もあり、sleepは適しません。
また、処理も含めて周期を決めたい場合には、sleepではなく、マルチスレッドによるバックグラウンドでの時間計測が必要になることも留意しておきましょう。
sleep関数の実装例
ここからは実際にsleep関数を実装したコードを紹介していきます。ここでは、より使用時のイメージがしやすいよう、具体的な処理内容に基づいたコードを記述しています。実装例を参考に自身のプログラムでも実装していき、どのような動作をしているかを確認していきましょう。
1秒間待ってから処理を実行
最も基本的な使い方としては数値を指定してsleep関数を実行する方法があります。前提として、sleep関数を扱うためには、timeモジュールをインポートする必要があり、その後timeモジュールのメンバ関数であるsleepを呼び出します。
以下のコードでは処理を1秒間停止した後に、次の行のprint処理が実行されます。前述したように小数点以下を指定してミリ秒単位の停止を行うこともできますが、OSに応じて精度に限界があるので注意しましょう。
import time
print("sleep start")
time.sleep(1)
print("sleep end")
1秒ごとに決められた処理を実行
sleep関数は、もちろんfor文などの繰り返し命令の中でも使用することができます。前述のように、プログラム外への負荷を低減する目的やデバッグで繰り返し処理のログ出力を見やすくしたい時に活用します。
以下のコードでは100回ループするfor文の中で繰り返し毎に1秒間処理を停止させてから、次の繰り返し処理を実行しています。1秒間を100回繰り返すため、合計で100秒間の処理時間がかかることが分かります。
import time
print("for start")
for i in range(100):
print("start")
time.sleep(1)
print("end")
待ち時間を変数で指定
sleep関数の引数にはもちろん変数を指定することもできます。これを利用すれば処理結果に応じて待ち時間を調整することも可能です。例えば、ある処理の結果から得られた回数値に応じて5秒単位で待つプログラムは下記のように記述できます。
import time
wait_count = 2*4 #ここでは例として数値計算の結果とする
print("for start")
sleep(5*wait_count)
print("end")
応用的な使用方法
最後にPythonのsleepに関する応用的な使い方を紹介していきます。sleep自体が非常にシンプルな関数であるので、応用とはいってもそこまで複雑ではありません。
指定された時刻まで待つ
sleep関数の引数に変数を使用できることを利用し、指定された時刻まで待ってから次の処理を行うような応用的な使い方もできます。Pythonではdatetimeモジュールにて現在の時刻を取得することも可能です。
また、同じくdatetimeモジュールで日時を指定することができるため、差分を取ることで指定日時まで待ち続けるプログラムを作ることが可能です。
import time
import datetime
now = datetime.now()
end_time = datetime.datetime(2024, 7, 23, 12, 0, 0, 0)
wait_sec = (end_time - now).seconds
print("start wait")
sleep(wait_sec )
print("end wait")
ミリ秒の精度でsleepするには
前述のようにPythonのsleep関数はOSタイマーに依存するため、ミリ秒単位での待ち時間を実現することはできません。では、Pythonで上記で実現するにはどうしたらいいでしょうか。
Pythonには様々なライブラリがあります。例えば、「win-precise-time」というライブラリを使用すれば、特別な処理をすることなく、ミリ秒単位のsleepを実現できます。このライブラリは、Windowsに搭載されている精密タイマーと連携することでミリ単位の精度をサポートしています。
実装に関しては、以下のようにまずpipでライブラリをインストールした後に該当のライブラリをインポートするだけです。sleepと同じ要領で使用することができます。
pip install win-precise-time
import win_precise_time
win_precise_time.sleep(0.001)
【参考】:win-precise-time
sleep関数を使いこなし、Pythonのコーディングスキルを向上させよう
本記事ではPythonのsleep関数の概要から使い方、実装例などを紹介してきました。sleep自体は非常にシンプルな処理ですが、ユースケースは様々であり、実装のイメージをつけることができたのではないでしょうか。
Pythonには他にも様々な関数があり、アプリ開発をしていくためには、それらを使いこなす必要があります。sleepは他の関数と比べて非常にわかりやすい処理のため、スムーズに使い方が理解できたと思いますが、より複雑な機能を持つ関数ではそうもいきません。
実装例などを参考にしつつ関数の使い方を学び、着実なスキルアップを目指していきましょう。
編集部オススメコンテンツ
アンドエンジニアへの取材依頼、情報提供などはこちらから