プログラムの実行を少しだけ待たせたいとき、Pythonでは標準ライブラリのtime.sleep
が便利です。
待機時間は秒単位で、整数だけでなく小数(0.1秒や0.001秒など)も指定できます。
使い方はシンプルですが、待機中は実行が止まるという性質を理解しておくことが重要です。
本記事では、基本の書き方から実用例、注意点まで丁寧に解説します。
time.sleepとは
秒単位で待機する関数
time.sleep
は、Pythonプログラムの実行を指定した秒数だけ一時停止する関数です。
例えば、メッセージを一定間隔で表示したい、APIへのアクセス間隔を空けたい、カウントダウンを作りたい、といった用途で使われます。
実行中のプロセス(正確には呼び出したスレッド)がブロックされるため、待機中は他の処理は進みません。
UIやWebサーバーのメインスレッドでの使い方には注意が必要です。
importと基本文法
使う前にtime
モジュールをインポートする必要があります。
文法はとてもシンプルです。
構文
time.sleep(秒数)
と書きます。- 秒数には整数も小数も指定できます(例:
1
、0.5
、0.001
)。
# 基本のimport
import time
# 1秒だけ待機
time.sleep(1)
この例は画面出力がないため出力結果は省略します。
基本の使い方(time.sleepの書き方)
1秒だけスリープする
最も基本的な例として、1秒だけ待機してから次の処理を実行します。
import time
print("処理を開始します")
time.sleep(1) # 1秒待機
print("1秒待機しました。次の処理に進みます。")
処理を開始します
1秒待機しました。次の処理に進みます。
1秒の待機中は何も実行されません。
短い待機を挟みたいときに最もよく使う形です。
0.5秒など小数で待機する
time.sleep
は浮動小数点で秒数を指定できます。
0.1秒、0.25秒、0.5秒といった細かな間隔も可能です。
import time
print("0.5秒だけ待機します")
time.sleep(0.5) # 0.5秒(500ミリ秒)
print("0.5秒待機しました")
0.5秒だけ待機します
0.5秒待機しました
処理の間隔が短い場合でも、過度に細かい間隔(数ミリ秒未満)を正確に保つことはOSのスケジューリングの都合で難しいです。
必要な精度を見極めて設定してください。
分や時間を待つ(秒に換算)
分や時間を待ちたい場合は秒に換算して渡します。
たとえば2分は2 * 60
、3時間は3 * 60 * 60
です。
下の表は代表的な換算の目安です。
単位 | 秒に換算する式 | 例 |
---|---|---|
分(min) | 分 * 60 | 2 * 60 = 120 秒 |
時(hour) | 時 * 60 * 60 | 3 * 60 * 60 = 10800 秒 |
日(day) | 日 * 24 * 60 * 60 | 1 * 24 * 60 * 60 = 86400 秒 |
import time
# 実際には120秒待機になりますが、サンプルでは長時間の停止を避けるためsleepは短くしています。
minutes = 2
wait_seconds = minutes * 60 # 2分 → 120秒
print(f"{minutes}分は{wait_seconds}秒です。サンプルとして1秒だけ待機します。")
# 実運用では: time.sleep(wait_seconds)
time.sleep(1) # サンプルでは短く
print("サンプルの待機が完了しました")
2分は120秒です。サンプルとして1秒だけ待機します。
サンプルの待機が完了しました
実際に分単位や時間単位で待たせるコードは、運用時のみ有効化するなど慎重に扱うと良いです。
学習や検証では短めにしておくのが安全です。
ミリ秒相当の待機(0.001秒)
ミリ秒レベルの短い待機は0.001
秒のように小数で指定します。
import time
print("1ミリ秒(0.001秒)だけ待機します")
time.sleep(0.001)
print("待機しました")
1ミリ秒(0.001秒)だけ待機します
待機しました
OSや環境によっては指定より長くなることがあります。
time.sleepは「最低限この時間は待つ」程度の保証で、厳密なリアルタイム性はありません。
実用例(time.sleepの使いどころ)
ループで間隔を空ける
APIへのアクセスやログ出力など、連続で実行すると負荷が高い処理の間に、一定のインターバルを確実に挟む用途で使います。
import time
for i in range(3):
print(f"{i+1}回目の処理を実行します")
# ここで本来の処理を行う
time.sleep(1) # 次のループまで1秒休む
print("完了")
1回目の処理を実行します
2回目の処理を実行します
3回目の処理を実行します
完了
このパターンは実行頻度を穏やかにする効果があります。
APIのレートリミット対策にも役立ちます。
カウントダウンを作る
待機と表示を組み合わせれば、シンプルなカウントダウンも作れます。
import time
seconds = 5
print("カウントダウンを開始します")
for remain in range(seconds, -1, -1):
print(f"{remain}...")
time.sleep(1)
print("発進!")
カウントダウンを開始します
5...
4...
3...
2...
1...
0...
発進!
行を更新して進捗バー風に見せたい場合は、print(..., end="", flush=True)
などの工夫も可能です。
リトライ前に待機する
失敗した処理を再試行する前に一定時間待つ(バックオフ)のはよくあるパターンです。
ここでは疑似的に最初の2回を失敗、3回目で成功する例を示します。
import time
def fragile_operation(attempt):
# 疑似的に失敗を発生させる: 1回目と2回目は失敗、3回目で成功
if attempt < 3:
raise RuntimeError(f"一時的なエラー(試行{attempt}回目)")
return "OK"
max_retries = 3
for attempt in range(1, max_retries + 1):
try:
print(f"{attempt}回目の実行...")
result = fragile_operation(attempt)
print(f"成功: {result}")
break
except RuntimeError as e:
print(f"失敗: {e}")
if attempt < max_retries:
wait = 2 ** (attempt - 1) # 1, 2, 4秒...のように増やす(指数バックオフ)
print(f"{wait}秒待機してリトライします")
time.sleep(wait)
else:
print("リトライ上限に達しました")
1回目の実行...
失敗: 一時的なエラー(試行1回目)
1秒待機してリトライします
2回目の実行...
失敗: 一時的なエラー(試行2回目)
2秒待機してリトライします
3回目の実行...
成功: OK
指数バックオフは混雑時に負荷を抑える実践的なテクニックです。
必要なら上限時間を設けるなど、過度に待たない工夫を加えます。
注意点とコツ(time.sleepの落とし穴)
sleep中は処理が止まる
time.sleep
は呼び出したスレッドをブロックします。
GUIアプリのメインスレッドやWebフレームワークのリクエスト処理中に長く待つと、応答が止まるので注意しましょう。
非同期処理を使っている場合はasyncio.sleep
を使うと、他のタスクをブロックせずに待機できます。
長い待機は進捗を出す
ユーザーや運用者にとって無反応は不安の元です。
長い待機ではログや進捗表示を必ず出すと親切です。
コード例(1秒ごとにドットを表示)
import time
total = 5
print("処理中: ", end="", flush=True)
for _ in range(total):
print(".", end="", flush=True) # 進捗をドットで表示
time.sleep(1)
print(" 完了")
処理中: ..... 完了
どのくらい待つのかを明示するだけで、体感は大きく改善します。
可能ならキャンセル手段も用意しましょう。
必要以上に長くしない
sleepは「待つこと」自体が目的ではなく、必要な同期や間隔の確保が目的です。
次の点を意識しましょう。
- 目的に対して最短の妥当な間隔にする(例: ログは1秒、メトリクスは10秒など)。
- 条件が満たされたら即座に先へ進める設計にする(待機ループの途中で状態を確認して早期脱出)。
- 正確なタイミングが必要な場合はスケジューラやイベント駆動(例: ジョブスケジューラ、ファイル監視)の採用を検討する。
- sleepは指定時間より短くはならないが、状況により長くなることはある点を踏まえ、厳密な制御が必要なら別手法を検討する。
まとめ
本記事では、Pythonのtime.sleep
で処理を一定時間停止する方法を、基本の文法(秒数の指定や小数の扱い)から、分や時間への換算、ミリ秒レベルの待機まで解説しました。
実用例としてループのインターバル、カウントダウン、リトライ前の待機を示し、sleep中はブロックされることや長い待機では進捗を出すことといった注意点も押さえました。
最後に、「必要だから待つ」だけに留め、最小の時間と適切な設計で使うことが健全です。
適材適所でtime.sleep
を活用して、読みやすく安定したスクリプトを書いていきましょう。