Python Sleep 関数: コードに遅延を追加する方法

公開: 2022-12-01

このチュートリアルでは、Python の組み込み time モジュールの sleep() 関数を使用して、コードに時間遅延を追加する方法を説明します。

単純な Python プログラムを実行すると、コードの実行は時間の遅延なしで(ステートメントを次々に)順番に実行されます。 ただし、コードの実行を遅らせる必要がある場合もあります。 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
YouTube ビデオ

コード ブロックにさまざまな遅延を追加する

前の例では、2 つのprint()ステートメントの実行の間に 5 秒の固定遅延を導入しました。 次に、イテラブルをループするときに異なる遅延時間を導入する別の例をコーディングしましょう。

この例では、次のことを行います。

  • 文をループし、各単語にアクセスして出力します。
  • 各単語を出力した後、文の次の単語を出力する前に、特定の時間待ちたいと思います。

文字列の文字列をループする

文字列、 sentenceについて考えてみましょう。 これは、各単語がそれ自体が文字列である文字列です。

文字列をループすると、次のように各文字が取得されます。

 >>> sentence = "How long will this take?" >>> for char in sentence: ... print(char) # Output (truncated for readability) H o w . . . t a k e ?

しかし、これは私たちが望んでいることではありません。 文をループして各単語にアクセスしたいと思います。 これを行うには、 sentenceの文字列に対してsplit()メソッドを呼び出します。 これは、 sentenceの文字列を分割することによって取得された文字列のリストを、すべての空白の出現について返します。

 >>> sentence.split() ['How', 'long', 'will', 'this', 'take?'] >>> for word in sentence.split(): ... print(word) # Output How long will this take?

遅延が異なる Iterable をループする

例をもう一度見てみましょう。

  • sentenceは、各単語にアクセスするためにループしたい文字列です。
  • delay_timesは、ループを通過するたびにsleep()関数の引数として使用する遅延時間のリストです。

ここでは、 delay_timesリストと、 sentenceの文字列を分割して得られる文字列のリストの 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の数値です。

YouTube ビデオ

Python のカウントダウン タイマー

次の例として、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
YouTube ビデオ

マルチスレッドでのスリープ機能

Python スレッド モジュールは、すぐに使えるマルチスレッド機能を提供します。 Python では、Global Interpreter Lock (GIL) により、アクティブなスレッドが常に 1 つしか実行されていないことが保証されます。

python-スリープ-3

ただし、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タプルで指定された引数でtarget関数を実行するスレッドが作成されます。

この例では、関数func1func2 、およびfunc3は引数を取りません。 したがって、関数の名前だけをターゲットとして指定するだけで十分です。 次に、スレッド オブジェクトt1t2 、およびt3を、それぞれfunc1func2 、および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 秒という最長のスリープ期間を持つため、最後に実行を終了するスレッドです。

YouTube ビデオ

詳細については、Python でのマルチスレッドの基本に関するチュートリアルをお読みください。

結論

このチュートリアルでは、Python のsleep()関数を使用して時間遅延をコードに追加する方法を学習しました。

組み込みの時間モジュールtime.sleep()からsleep()関数にアクセスできます。 実行を n 秒遅らせるには、 time.sleep(n)を使用します。 また、異なる値、カウントダウン、およびマルチスレッドによって、ループ内の後続の反復を遅らせる例を見てきました。

これで、time モジュールのより高度な機能を調べることができます。 Python で日付と時刻を操作したいですか? time モジュールに加えて、datetime および calendar モジュールの機能を活用できます。

次に、Python で時差を計算する方法を学びます。