
このチュートリアルでは、Python の組み込み time モジュールの sleep() 関数を使用して、コードに時間遅延を追加する方法を説明します。
単純な Python プログラムを実行すると、コードの実行は時間の遅延なく、1 ステートメントずつ順番に行われます。 ただし、コードの実行を遅らせる必要がある場合もあります。 Python 組み込み time モジュールの sleep() 関数は、これを行うのに役立ちます。
このチュートリアルでは、Python で sleep() 関数を使用する構文と、その仕組みを理解するためのいくつかの例を学習します。 始めましょう!
Python time.sleep() の構文
Python 標準ライブラリに組み込まれている time モジュールは、時間に関連するいくつかの便利な関数を提供します。 最初のステップとして、time モジュールを作業環境にインポートします。
import time
sleep() 関数は time モジュールの一部であるため、次の一般的な構文でアクセスして使用できるようになりました。
time.sleep(n)
ここで、n はスリープする秒数です。 整数または浮動小数点数を指定できます。
場合によっては、必要な遅延が数ミリ秒になることがあります。 このような場合、期間をミリ秒単位で秒単位に変換し、それを sleep 関数の呼び出しで使用できます。 たとえば、100 ミリ秒の遅延を導入する場合は、time.sleep(0.1) のように 0.1 秒と指定できます。
▶ time モジュールから sleep 関数のみをインポートすることもできます。
from time import sleep
インポートに上記の方法を使用すると、time.sleep() を使用せずに、sleep() 関数を直接呼び出すことができます。
Python の sleep() 関数の構文を学習したので、コード例を使用して関数の動作を確認しましょう。 このチュートリアルで使用する Python スクリプトは、この GitHub リポジトリの python-sleep フォルダーからダウンロードできます。 👩🏽💻
sleep() によるコード実行の遅延
最初の例として、単純な Python プログラムの実行を遅らせるために sleep 関数を使用してみましょう。
次のコード スニペットでは:
- 最初の print() ステートメントは遅延なく実行されます。
- 次に、sleep() 関数を使用して 5 秒の遅延を導入します。
- 2 番目の print() ステートメントは、スリープ操作が終了した後にのみ実行されます。
# /python-sleep/simple_example.py import time print("Print now") time.sleep(5) print("Print after sleeping for 5 seconds")
simple_example.py ファイルを実行して、出力を確認します。
$ python3 simple_example.py
コード ブロックにさまざまな遅延を追加する
前の例では、2 つの print() ステートメントの実行の間に 5 秒の固定遅延を導入しました。 次に、イテラブルをループするときに異なる遅延時間を導入する別の例をコーディングしましょう。
この例では、次のことを行います。
- 文をループし、各単語にアクセスして出力します。
- 各単語を出力した後、文の次の単語を出力する前に、特定の時間待ちたいと思います。
文字列の文字列をループする
文字列、文を考えてみましょう。 これは、各単語がそれ自体が文字列である文字列です。
文字列をループすると、次のように各文字が取得されます。
>>> sentence = "How long will this take?" >>> for char in sentence: ... print(char) # Output (truncated for readability) H o w . . . t a k e ?
しかし、これは私たちが望んでいることではありません。 文をループして各単語にアクセスしたいと思います。 これを行うには、文の文字列に対して split() メソッドを呼び出します。 これは、文の文字列を分割することによって取得された文字列のリストを、すべての空白の出現について返します。
>>> sentence.split() ['How', 'long', 'will', 'this', 'take?'] >>> for word in sentence.split(): ... print(word) # Output How long will this take?
遅延が異なる Iterable をループする
例をもう一度見てみましょう。
- 文は、各単語にアクセスするためにループしたい文字列です。
- delay_times は、ループを通過するたびに sleep() 関数の引数として使用する遅延時間のリストです。
ここでは、delay_times リストと、文の文字列を分割して得られる文字列のリストの 2 つのリストを同時にループしたいと考えています。 zip() 関数を使用して、この並列反復を実行できます。
Python zip() 関数: zip(list1, list2) は、タプルの反復子を返します。各タプルには、list1 と list2 のインデックス i にある項目が含まれます。
# /python-sleep/delay_times.py import time sleep_times = [3,4,1.5,2,0.75] sentence = "How long will this take?" for sleep_time,word in zip(sleep_times,sentence.split()): print(word) time.sleep(sleep_time)
スリープ機能がないと、制御はすぐに次の反復に進みます。 遅延を導入したため、ループの次のパスは、スリープ操作が完了した後にのみ発生します。
delay_times.py を実行して、出力を観察します。
$ python3 delay_times.py
文字列内の後続の単語は、遅れて出力されます。 文字列のインデックス i にある単語を出力した後の遅延は、delay_times リストのインデックス i の数値です。
Python のカウントダウン タイマー
次の例として、Python で簡単なカウントダウン タイマーをコーディングしてみましょう。
関数 countDown() を定義しましょう:
# /python-sleep/countdown.py import time def countDown(n): for i in range(n,-1,-1): if i==0: print("Ready to go!") else: print(i) time.sleep(1)
次に、countDown() 関数の定義を解析しましょう。
- この関数は、引数として数値 n を受け取り、その数値 n からゼロまでカウントダウンします。
- time.sleep(1) を使用して、カウント間に 1 秒の遅延を実現します。
- カウントが 0 になると、関数は「Ready to go!」を出力します。
🎯 カウントダウン操作を実現するために、負のステップ値 -1 で range() 関数を使用しました。 range(n, -1, -1) は、n、n – 1、n – 2 などの数値の範囲をゼロまでループするのに役立ちます。 range() 関数を使用する場合、終点はデフォルトで除外されることを思い出してください。
次に、5 を引数として countDown() 関数の呼び出しを追加しましょう。
countDown(5)
スクリプト countdown.py を実行して、countDown 関数の動作を確認してください。
$ python3 countdown.py
マルチスレッドでのスリープ機能
Python スレッド モジュールは、すぐに使えるマルチスレッド機能を提供します。 Python では、Global Interpreter Lock (GIL) により、アクティブなスレッドが常に 1 つしか実行されていないことが保証されます。
ただし、I/O 操作やスリープなどの待機操作中に、プロセッサは現在のスレッドの実行を中断し、待機中の別のスレッドに切り替えることができます。
これがどのように機能するかを理解するために、例を見てみましょう。
Python でのスレッドの作成と実行
次の関数、func1()、func2()、および func3() を検討してください。 数値の範囲をループして出力します。 これに続いて、ループを通過するたびに特定の秒数のスリープ操作が行われます。 実行がスレッド間で同時にどのように切り替わるかをよりよく理解するために、関数ごとに異なる遅延時間を使用しました。
import time def func1(): for i in range(5): print(f"Running t1, print {i}.") time.sleep(2) def func2(): for i in range(5): print(f"Running t2, print {i}.") time.sleep(1) def func3(): for i in range(4): print(f"Running t3, print {i}.") time.sleep(0.5)
Python では、Thread() コンストラクターを使用してスレッド オブジェクトをインスタンス化できます。 構文 threading.Thread(target = …, args = …) を使用すると、args タプルで指定された引数でターゲット関数を実行するスレッドが作成されます。
この例では、関数 func1、func2、および func3 は引数を取りません。 したがって、関数の名前だけをターゲットとして指定するだけで十分です。 次に、スレッド オブジェクト t1、t2、および t3 を、それぞれ func1、func2、および func3 をターゲットとして定義します。
t1 = threading.Thread(target=func1) t2 = threading.Thread(target=func2) t3 = threading.Thread(target=func3) t1.start() t2.start() t3.start()
スレッド化の例の完全なコードは次のとおりです。
# /python-sleep/threads.py import time import threading def func1(): for i in range(5): print(f"Running t1, print {i}.") time.sleep(2) def func2(): for i in range(5): print(f"Running t2, print {i}.") time.sleep(1) def func3(): for i in range(4): print(f"Running t3, print {i}.") time.sleep(0.5) t1 = threading.Thread(target=func1) t2 = threading.Thread(target=func2) t3 = threading.Thread(target=func3) t1.start() t2.start() t3.start()
出力を観察します。 実行は 3 つのスレッド間で変更されます。 スレッド t3 は待機時間が最も短いため、中断される時間も最も短くなります。 スレッド t1 は 2 秒という最長のスリープ期間を持つため、最後に実行を終了するスレッドです。
詳細については、Python でのマルチスレッドの基本に関するチュートリアルをお読みください。
結論
このチュートリアルでは、Python の sleep() 関数を使用して時間遅延をコードに追加する方法を学習しました。
組み込みの時間モジュール time.sleep() から sleep() 関数にアクセスできます。 実行を n 秒遅らせるには、time.sleep(n) を使用します。 また、異なる値、カウントダウン、およびマルチスレッドによって、ループ内の後続の反復を遅らせる例を見てきました。
これで、time モジュールのより高度な機能を調べることができます。 Python で日付と時刻を操作したいですか? time モジュールに加えて、datetime および calendar モジュールの機能を活用できます。
次に、Python で時差を計算する方法を学びます。⏰