コンテンツにスキップ

Pythonでの待機方法を簡単に解説

CodeMDD.io

Python sleep(): コードに時間遅延を追加する方法

中級者のPython開発者向けのこのチュートリアルでは、Pythonプログラムが何かを待つ必要がある場合について学びます。ほとんどの場合、コードはできるだけ速く実行することを望むでしょう。しかし、プログラムをしばらく休止させることが最善の選択肢となるケースもあります。

たとえば、Pythonのsleep()関数を使用してプログラムの遅延をシミュレートすることができます。ファイルのアップロードやダウンロード、グラフィックの読み込みや画面への描画を待つ必要がある場合などです。Web APIへの呼び出し間やデータベースへのクエリ間の休止時間もあります。Pythonのsleep()関数をプログラムに追加することで、これらのケースやその他のケースで役立ちます。

このチュートリアルでは、以下の方法でPythonのsleep()関数を追加する方法を学びます:

  • time.sleep()
  • デコレータ
  • スレッド
  • Async IO
  • グラフィカルユーザーインターフェース

この記事は、Pythonの知識を深めたい中級者の開発者を対象としています。もしあなたがそのような人なら、さっそく始めましょう!

無料特典: よりクリーンでPythonらしいプログラムを書くために使用できる、3つの高度なデコレータのパターンとテクニックを紹介する、無料の「The Power of Python Decorators」ガイドと一緒にコードしてみましょう。

Pythonのsleep()関数をtime.sleep()で追加する

time.sleep()の使い方の例を見てみましょう:

import time
time.sleep(3) # 3秒間休止する

上記のコードをコンソールで実行すると、新しいステートメントを入力する前に遅延が発生します。

注意: Python 3.5では、コアデベロッパーはtime.sleep()の動作をわずかに変更しました。新しいPythonのsleep()システムコールは、指定した秒数の最低限の休止時間を確保します。ただし、休止がシグナルによって中断された場合には適用されません。ただし、シグナル自体が例外を発生させる場合は適用されません。

Pythonのtimeitモジュールを使用して、休止時間がどれくらいかをテストすることもできます:

ターミナルウィンドウ
$ python3 -m timeit -n 3 "import time; time.sleep(3)"
3 loops, best of 5: 3 sec per loop

ここでは、timeitモジュールを-nパラメータとともに実行し、その後に続く文を何回実行するかをtimeitに伝えています。3回実行され、最良の実行時間が3秒であることがわかります。

timeitがコードを実行するデフォルトの回数は100万回です。デフォルトの-nで上記のコードを実行すれば、イテレーションごとに3秒かかるので、ターミナルが約34日間停止します!timeitモジュールには、コマンドラインオプションもいくつかあります。詳細はドキュメンテーションを確認してください。

もう少し現実的なものを作ってみましょう。システム管理者は、ウェブサイトのダウンを検知する必要があります。定期的にウェブサイトのステータスコードをチェックしたいのですが、ウェブサーバーに負荷をかけ過ぎないようにするために、遅延を入れることが重要です。

次の例では、time.sleep()を使用して定期的にウェブサイトをチェックするコードを示します:

import time
import requests
def check_website(url):
while True:
response = requests.get(url)
if response.status_code != 200:
print(f"Website {url} is down")
time.sleep(60) # 60秒間休止する
check_website('https:https://codemdd.io/www.example.com')

このコードでは、whileループでウェブサイトをチェックし、ウェブサイトが応答しない場合に「Website {url} is down」と出力します。その後、60秒間の休止時間が設定され、次にウェブサイトがチェックされます。

この例では、1時間ごとにウェブサイトのステータスをチェックすることになります。休止時間を調整することで、さまざまな頻度でステータスをチェックすることもできます。

time.sleep()を使ってPythonにsleep()関数を追加する

time.sleep()を使ってsleep()関数をプログラムに追加することは非常に簡単です。time.sleep()関数には、プログラムを停止させたい秒数を指定します。

たとえば、以下のコードは5秒間プログラムを休止させます:

import time
time.sleep(5)

time.sleep()は、スクリプトを指定した秒数だけ停止させます。これにより、他の処理が実行される前に指定した秒数待つことができます。

デコレータを使ってPythonのsleep()関数を追加する

デコレータを使ってPythonのsleep()関数を実装すると、コードラインの間に遅延を追加できます。これを行うには、内部関数を作成し、その関数に遅延を実装するデコレータを適用します。

以下は、デコレータを使ってsleep()関数を実現する例です:

import time
def sleep(seconds):
def decorator(func):
def wrapper(*args, **kwargs):
time.sleep(seconds)
return func(*args, **kwargs)
return wrapper
return decorator

このコードでは、sleep()関数を定義しています。sleep()関数は、デコレータを返す関数です。デコレータ自体は、関数の実行前に指定した秒数だけ遅延を追加する内部関数を作成します。

デコレータを使って遅延を追加するには、次のように関数をデコレータで修飾します:

@sleep(3)
def my_function():
print("Hello, world!")
my_function()

上記のコードでは、my_function()を呼び出す前に5秒の遅延が発生します。

デコレータを使用すると、関数の実行の前後に特定のコードを追加することができます。この例では、関数の実行前に指定した秒数だけ遅延を追加しています。

デコレータを使ってsleep()関数を作成することで、関数の実行に遅延を追加することができます。これは、関数の実行時間を制御したり、並行処理をシミュレートしたりするために使用できます。

スレッドを使ってPythonのsleep()関数を追加する

Pythonのsleep()関数を使用してスレッドを休止させることで、並行処理を制御したり、複数のタスクを同時に実行したりすることができます。

以下は、time.sleep()を使用してスレッドを休止させる例です:

import threading
import time
def sleep(seconds):
time.sleep(seconds)
thread = threading.Thread(target=sleep, args=(3,))
thread.start()

上記のコードでは、threading.Threadクラスを使用して新しいスレッドを作成し、そのスレッドでsleep()関数を呼び出しています。target引数には関数の名前を指定し、args引数には関数に渡す引数を指定します。スレッドを開始するには、thread.start()を呼び出します。

スレッドは、指定した秒数だけスリープしてから終了します。これにより、メインスレッドとは別のスレッドで処理を実行することができます。

Pythonのスレッドを使用してタスクを並行実行することで、マルチスレッドアプリケーションを作成することもできます。各スレッドには、異なるタスクを実行するための関数が指定されます。

Async IOを使ってPythonのsleep()関数を追加する

PythonのAsync IOを使って非同期処理を実装すると、イベントループでのタスクの実行時間を制御することができます。asyncio.sleep()関数を使用してタスクの実行を一時停止してから再開することができます。

以下は、Async IOを使ったsleep()関数の例です:

import asyncio
async def sleep(seconds):
await asyncio.sleep(seconds)
async def my_task():
print("Task started")
await sleep(3)
print("Task resumed")
asyncio.run(my_task())

上記のコードでは、asyncキーワードを使用して非同期関数を定義しています。sleep()関数はawaitキーワードを使って非同期に呼び出され、指定した秒数だけ処理を一時停止します。また、my_task()関数は非同期関数であり、sleep()関数を非同期に呼び出します。

asyncio.run()関数を使用してmy_task()関数を実行します。上記のコードでは、my_task()関数を実行する前に3秒の遅延が発生し、その後にタスクが再開されます。

Async IOを使用すると、複数のタスクを同時に実行することができます。それぞれのタスクは非同期関数として実装され、イベントループで実行されます。

GUIでPythonのsleep()関数を追加する

PythonのGUIフレームワークを使用してアプリケーションを開発する場合、sleep()関数を使用して遅延を追加することができます。各GUIフレームワークには、sleep()関数を使用してウィンドウが一時的に停止するためのメソッドが用意されています。

以下は、PythonのGUIフレームワークでsleep()関数を使用する例です:

Tkinterでスリープする

import tkinter as tk
import time
def sleep(seconds):
window = tk.Tk()
window.withdraw()
time.sleep(seconds)
window.destroy()
sleep(3)

上記のコードでは、Tk()メソッドを使用して新しいウィンドウを作成し、withdraw()メソッドでウィンドウを非表示にします。その後、time.sleep()関数を使用して指定した秒数だけスリープします。最後に、destroy()メソッドを使用してウィンドウを破棄します。

上記のコードでは、3秒間ウィンドウを表示せずに待機します。

wxPythonでスリープする

import wx
import time
class MyFrame(wx.Frame):
def __init__(self, parent, title):
super().__init__(parent, title=title, size=(300, 200))
self.Centre()
def sleep(seconds):
app = wx.App()
frame = MyFrame(None, "Sleep Example")
frame.Show()
time.sleep(seconds)
frame.Close()
app.Exit()
sleep(3)

上記のコードでは、wx.Frameクラスを継承したMyFrameクラスを作成し、その中で新しいフレームを表示します。appオブジェクトを作成し、MyFrameオブジェクトをインスタンス化してフレームを表示します。その後、指定した秒数だけスリープし、フレームを閉じます。最後に、アプリケーションを終了します。

上記のコードでは、3秒間フレームを表示せずに待機します。

PythonのGUIフレームワークを使用してアプリケーションを開発する場合、特定のイベントの発生または特定の条件に基づいて遅延を追加することができます。これにより、アプリケーションの操作や表示に遅延を追加することができます。

まとめ

Pythonのsleep()関数を使ってプログラムに遅延を追加することで、様々なケースで役立つことがあります。time.sleep()を使って休止時間を追加する方法、デコレータを使って関数に遅延を追加する方法、スレッドを使って並行処理を制御する方法、Async IOを使って非同期処理を実装する方法、GUIフレームワークを使ってウィンドウの表示を遅延させる方法を学びました。

遅延を追加することで、プログラムの実行を制御し、処理のタイミングを調整することができます。これは、タスクの順番を制御したり、リソースの競合を回避したりするために役立ちます。

今回のチュートリアルでは、Pythonのsleep()関数を使ってプログラムに時間遅延を追加する方法を詳しく説明しました。これを活用して、自分のプログラムに適切な遅延を追加してみてください。適切なタイミングでの遅延は、プログラムのパフォーマンスやユーザーエクスペリエンスを向上させるのに役立ちます。