IT・WEB・ゲーム業界の転職に強いR-Stone

転職コラム

【Python】time.sleepの使い方と実務での注意点!処理の一時停止/待機から非同期処理(asyncio)まで徹底解説

Pythonでプログラムを実行する際、

「処理を少しだけ止めたい」

「APIの呼び出し間隔を1秒空けたい」

といった場面は頻繁に発生します。

Pythonで処理を一時停止(待機)させたいときに使われるのが、標準ライブラリであるtimeモジュールのtime.sleep()関数です。

本記事では、time.sleep()の基本的な使い方(1秒待つ方法やミリ秒単位の指定)から

スクレイピングやリトライ処理といった実務での活用シーン、

Webアプリ開発で注意すべき「ブロッキングの罠」、さらにはasyncio.sleep()を用いた非同期処理へのステップアップまで徹底解説します。

Contents

1分でわかる!Pythonで処理を一時停止(待機)する「time.sleep」の基本

Pythonには他言語でよく見られる「wait関数」という名称の関数は存在せず、代わりにtime.sleep()を使用します。

まずは最小限のコードで、基本文法と「1秒待つ」書き方を確認しましょう。

timeモジュールのインポートと基本文法

time.sleep()を使用するには、まず標準ライブラリのtimeモジュールをimportします。

 import time

 # 処理を一時停止(引数には待機したい秒数を指定)   
 time.sleep(秒数)

time.sleep(1) で「1秒待つ」具体的なコード例

以下のコードを実行すると、最初の出力から「1秒待機」した後に次の処理が実行されます。

 import time print(“処理を開始します”)

 # 1秒間だけ処理を一時停止(待機)
 time.sleep(1)

 print(“1秒経過しました:処理を終了します”)   

小数点(秒以下:0.5秒、100ミリ秒など)を指定する方法

time.sleep()の引数には整数だけでなく浮動小数点数(float)も指定できます。

1秒未満のミリ秒単位で処理を停止させたい場合も簡単に記述可能です。

 import time

 # 0.5秒(500ミリ秒)待機   
 time.sleep(0.5)

 # 0.1秒(100ミリ秒)待機   
 time.sleep(0.1)

 # 0.01秒(10ミリ秒)待機   
 time.sleep(0.01)

どんな場面で使う?time.sleepの主な活用シーンと実務での作法

単に処理を止めるだけでなく、実務のWeb開発やスクリプト作成においてtime.sleepはどのような目的で使われるのでしょうか。

代表的な3つの活用シーンを紹介します。

① スクレイピング時のサーバーマナー(連続アクセスによるIPブロック防止)

Webスクレイピングで連続してリクエストを送信すると、相手のWebサーバーに過度な負荷をかけてしまいます。

最悪の場合、DOS攻撃とみなされてIPアドレスがブロックされたり、法的トラブルに発展するリスクもあります。

アクセス間にtime.sleep(1)などを挟み、最低でも1秒以上待機させるのが開発者の必須マナーです。

 import time
 import requests

 urls = [“https://example.com/page1”, “https://example.com/page2”, “https://example.com/page3”]

 for url in urls:
         response = requests.get(url)
         print(f”{url} の取得完了: ステータスコード {response.status_code}“)

         # サーバー負荷軽減のため、次のアクセスまで必ず1秒待つ
   time.sleep(1)

② 外部API呼び出し時のレートリミット(回数制限)回避

X(Twitter)やOpenAI、各種SaaSのAPIには

「1分間に100回まで」といったレートリミット(Rate Limit)が設けられています。

上限を超えるとエラー(HTTP 429 Too Many Requests)が発生するため、ループ処理の中で一定時間待機させてアクセス頻度を調整します。

③ リトライ処理(エラー発生時に数秒待ってから再試行するアルゴリズム)

ネットワーク通信やデータベース接続が一時的に不安定になった際、即座にエラーで落とすのではなく、
「3秒待ってからもう一度試す」といった指数バックオフ(Exponential Backoff)アルゴリズムの実装に使われます。

 import time

 def connect_with_retry(max_retries=3):
   for i in range(max_retries):

    try:
        # 接続処理(例)
        print(f”接続試行 {i+1} 回目…”)

        # 成功したと仮定
        return True
     except Exception as e:

       print(f”接続失敗: {e}“)
       if i < max_retries – 1:
        wait_time = 2 ** i  # 1秒、2秒、4秒…と段階的に待機時間を伸ばす   
        print(f”{wait_time}秒後にリトライします”)
         time.sleep(wait_time)
    return False

知っておくべき「time.sleep」の罠と注意点

非常に便利なtime.sleep()ですが、実務で使う際にはいくつかの落とし穴が存在します。

精度(ミリ秒単位)の限界とOS(Windows/Linux)依存の挙動の違い

time.sleep(0.001)(1ミリ秒)のように極めて短い時間を指定した場合、指定した時間通りに厳密に再開されるとは限りません。

これは、OS(Windows、Linux、macOS)のスケジューラーの精度やタイマーの分解能に依存するためです。

リアルタイム性が厳密に求められる制御系プログラムや高頻度取引(HFT)などでは、time.sleep()だけに頼る設計は避ける必要があります。

WebフレームワークやGUIで「アプリ全体がフリーズする」原因(ブロッキング処理の罠)

time.sleep()は「実行しているスレッド全体を休止させる(ブロッキング動作)」関数です。

そのため、FastAPIやDjango、FlaskなどのWebアプリケーションや、

Tkinter/PyQtなどのGUIアプリのメインスレッドでtime.sleep()を実行してしまうと、

待機中、他のユーザーからのリクエスト処理や画面描画がすべてストップ(画面フリーズ)してしまいます。

【ステップアップ】FastAPIやDjango、Webアプリで使える非同期待機(asyncio.sleep)

 

前述の「スレッド全体が止まってしまう」問題を解決するために、モダンなPython開発(FastAPIや非同期Webフレームワーク)で使われるのがasyncio.sleep()です。

time.sleep と asyncio.sleep の決定的な違い(同期 vs 非同期)

・time.sleep()(同期処理):

プログラムの実行スレッドそのものを止める。待機中は一切の他の作業ができない。

・asyncio.sleep()(非同期処理):

「この処理は待機中」というマークをつけ、待機している間に他のタスク(他のユーザーからのリクエストなど)をCPUに並行処理させる。

非同期処理(async / await)で処理速度を落とさずに待機させる実装パターン

FastAPIなどのasync defで定義された関数内では、time.sleep()ではなく必ずawait asyncio.sleep()を使用します。

 import asyncio

 async def fetch_data(task_id):
     print(f”タスク {task_id} 開始”)

     # スレッドを止めず、非同期に1秒待機(他タスクへ処理権を譲る)   
     await asyncio.sleep(1)

     print(f”タスク {task_id} 完了”)

 async def main():
    # 3つのタスクを並行して実行
     await asyncio.gather(

        fetch_data(1),
        fetch_data(2),
        fetch_data(3)
      )

 # 非同期イベントループの実行
 asyncio.run(main())

【実行結果】
time.sleep(1)を3回実行すると合計3秒かかりますが、
asyncio.sleep(1)を使えば3つのタスクが並行して待機するため、わずか約1秒で全タスクが完了します。

「非同期処理や大量アクセス制御」を考慮したモダン開発できていますか?

Pythonの基礎文法であるtime.sleep()ですが、単に「1秒止める」知識から一歩進んで、実務で重要になるのは

「なぜ止めるのか」

「非同期処理(asyncio)を使ってどう全体のパフォーマンスを最適化するか」

というシステム設計の視点です。

しかし、実際の現場によっては以下のような課題を抱えているエンジニアの方も少なくありません。

・「簡単なスクリプト作成や保守開発ばかりで、FastAPIやasyncioを使った大規模開発を経験できない」

・「パフォーマンスチューニングや高負荷対策にチャレンジしたいが、アサインされる案件がレガシーである」

単なる実装者から「高アクセス・パフォーマンス最適化ができるPythonエンジニア」へキャリアアップするためには、モダンな技術スタックを採用している環境に身を置くことが近道です。

まとめ:Pythonの基礎から「パフォーマンスを意識した設計」へ

Pythonで処理を一時停止・待機させるtime.sleep()は、スクレイピングやリトライ処理などで欠かせない基本関数です。

・基本は time.sleep(秒数)(小数点でミリ秒指定も可能)

・Webアプリや並行処理では、スレッドを止めない await asyncio.sleep() を検討する

文法を理解したうえで、システム全体に負荷をかけない適切な使い分けを心がけましょう。

【Pythonエンジニア】単なる実装から「高並行・パフォーマンス最適化」ができるエンジニアへ

「今の現場では簡単なスクリプトや保守開発しか担当できない」

「FastAPIやasyncio、AWSを活用したモダンな開発に挑戦したい」

そんな思いが心をよぎったことはありませんか?

アールストーンでは、Pythonを駆使した自社プロダクトやプライム直請けの「高単価・モダン環境」求人を多数保有しています。

Python×あなたのメインスキル(言語や領域)で見込める適正年収や、将来狙えるキャリアパスについて、選考要素なしの無料相談は随時受付中!

画面上部「無料相談」や こちら からお気軽にお声がけください!