Python - スレッドスケジューリング

こんにちは、将来のPythonのマエストロ!今日は、Pythonでのスレッドスケジューリングの魅力的な世界に飛び込んでいきます。プログラミングが初めてであっても心配しないでください;私は年々教えた無数の学生たちにも同様に一歩一歩案内してきました。この素晴らしい冒険に一緒に出発しましょう!

Python - Thread Scheduling

スレッドの理解

スケジューリングに飛び込む前に、まずスレッドとは何かを簡単に復習しましょう。本を読んでいる間に音楽を聞いていると想像してください。あなたの脳は基本的に2つの「スレッド」を同時に動かしています - 一つは読むためのもので、もう一つは聞くためのものです。プログラミングでは、スレッドは同様に動作し、プログラムが並行して複数のタスクを実行できるようにします。

タイマークラスを使用したスレッドのスケジューリング

では、まず最初のスケジューリング方法、タイマークラスを探ってみましょう。それは、コードにアラーム時計を設定するようなものです!

タイマークラスとは?

タイマークラスは、Pythonのthreadingモジュールの一部です。指定された遅延後に関数を実行させることができます。それは、「このタスクを私のために実行して、しかし、始める前に少し待って」とPythonに伝えるのに使えます。

タイマークラスの使用方法

簡単な例を見てみましょう:

import threading
import time

def greet(name):
print(f"こんにちは、{name}!今の時間は{time.strftime('%H:%M:%S')}")

# タイマーオブジェクトを作成
t = threading.Timer(5, greet, args=["Alice"])

# タイマーを開始
t.start()

print("タイマー開始!")

# タイマーが完了するのを待機
t.join()

print("タイマー完了!")

これを分解して見てみましょう:

  1. 必要なモジュールをインポートします:threadingtime
  2. 簡単なgreet関数を定義し、現在の時間とともに挨拶を表示します。
  3. タイマーオブジェクトを作成し、5秒遅延後にgreet関数を実行し、”Alice”を引数として渡します。
  4. t.start()でタイマーを開始します。
  5. t.join()を使用して、次に進む前にタイマーが完了するのを待ちます。

これを実行すると、「タイマー開始!」が今すぐ表示され、その後5秒の一時停止後に挨拶が表示され、その後「タイマー完了!」が表示されます。

タイマーのキャンセル

時々、スケジュールされたタスクをキャンセルする必要があるかもしれません。それは、アラームを全く必要としなくなったときのようなものです。以下はその方法です:

import threading
import time

def task():
print("このタスクは実行されません!")

t = threading.Timer(5, task)
t.start()

print("タイマーは開始されましたが、キャンセルしましょう...")
time.sleep(2)  # 2秒待機
t.cancel()  # タイマーをキャンセル
print("タイマーがキャンセルされました!")

この例では、タスクをスケジュールしても、実行する前にキャンセルしています。

schedモジュールを使用したスレッドのスケジューリング

次に、schedモジュールについて見ていきましょう。タイマークラスはシンプルなアラーム時計のようなものであるのに対して、schedモジュールは完全に充実したスケジューリングアプリのようなものです!

schedモジュールとは?

schedモジュールは、特定の時間に発生する複数のイベントをスケジューリングすることができます。シンプルな遅延よりも複雑なスケジューリングが必要な場合に最適です。

schedモジュールの使用方法

例を見てみましょう:

import sched
import time

# スケジューラーオブジェクトを作成
s = sched.scheduler(time.time, time.sleep)

def print_time(name):
print(f"こんにちは、{name}!今の時間は{time.strftime('%H:%M:%S')}")

# イベントをいくつかスケジューリング
s.enter(2, 1, print_time, argument=("Alice",))
s.enter(4, 2, print_time, argument=("Bob",))
s.enter(6, 3, print_time, argument=("Charlie",))

print("スケジューラー開始!")
s.run()
print("スケジューラー完了!")

これを分解して見てみましょう:

  1. sched.scheduler()を使用してスケジューラーオブジェクトを作成します。
  2. 簡単なprint_time関数を定義します。
  3. s.enter()を使用して3つのイベントをスケジューリングします:
  • 最初の引数は秒単位の遅延です。
  • 二つ目は優先度です(数字が小さいほど優先度が高い)。
  • 三つ目は実行する関数です。
  • argumentキーワードを使用して関数に引数を渡します。
  1. s.run()でスケジューラーを開始します。

これを実行すると、2秒おきに挨拶が表示されます。

スケジュールされたイベントのキャンセル

タイマーと同様に、schedでスケジュールされたイベントをキャンセルすることができます:

import sched
import time

s = sched.scheduler(time.time, time.sleep)

def task(name):
print(f"こんにちは、{name}!")

event1 = s.enter(2, 1, task, argument=("Alice",))
event2 = s.enter(4, 1, task, argument=("Bob",))

print("イベントがスケジュールされました。Bobのイベントをキャンセルしましょう...")
s.cancel(event2)

s.run()
print("スケジューラー完了!")

この例では、2つのイベントをスケジュールしても、実行前に第二のイベントをキャンセルしています。

タイマーとschedの比較

以下は、私たちが学んだ2つの方法の簡単な比較です:

機能 タイマー sched
使いやすさ シンプルで直感的 より複雑ですがより強力
複数のイベント 一度に一つ 複数のイベントをスケジューリング可能
精度 より低い より高い
キャンセル 実行前にキャンセル可能 いつでもキャンセル可能
使用例 シンプルな遅延 複雑なスケジューリングの必要

結論

それでは、皆さん!私たちはPythonでのスレッドスケジューリングの世界を、シンプルなタイマークラスからより複雑なschedモジュールまで旅してきました。覚えるのは自転車に乗るように、これらのコンセプトをマスターするには練習が必要です。だから、实验を恐れずにし、間違いを犯しても大丈夫です - それが私たちの学び方です!

私の教える年月の中で、学生たちが完全に初心者からPythonのプロになることを何度も見てきました。そして、皆さんも同じことができると確信しています。コーディングを続け、学び続け、そして最も重要なのは、それを楽しんでください!

次回まで、幸せなコーディングを!

Credits: Image by storyset