Python - Thread Scheduling

Hallo da, zukünftige Python-Meister! Heute tauchen wir in die faszinierende Welt der Thread-Scheduling in Python ein. Mach dir keine Sorgen, wenn du neu in der Programmierung bist; ich werde dich auf dieser Reise Schritt für Schritt führen, genauso wie ich es für unzählige Studenten in meinen Jahren des Unterrichtens getan habe. Embarkieren wir gemeinsam auf diese aufregende Abenteuerreise!

Python - Thread Scheduling

Threads verstehen

Bevor wir zu dem Scheduling springen, lassen Sie uns schnell zurückblicken, was Threads sind. Stell dir vor, du liest ein Buch, während du Musik hörst. Dein Gehirn führt essentially zwei "Threads" gleichzeitig aus - einer zum Lesen und einer zum Hören. In der Programmierung arbeiten Threads ähnlich, sie ermöglichen es einem Programm, mehrere Aufgaben gleichzeitig auszuführen.

Threads mit der Timer-Klasse planen

Nun erkunden wir unsere erste Methode des Thread-Schedulings: die Timer-Klasse. Es ist wie ein Wecker für deinen Code einzustellen!

Was ist die Timer-Klasse?

Die Timer-Klasse ist Teil des threading-Moduls in Python. Sie ermöglicht es dir, eine Funktion nach einer angegebenen Verzögerung auszuführen. Stell dir vor, du sagst Python: "Hey, führe diese Aufgabe für mich aus, aber warte ein bisschen, bevor du beginnst!"

Wie man die Timer-Klasse verwendet

Lassen Sie uns ein einfaches Beispiel anschauen:

import threading
import time

def grüßen(name):
print(f"Hallo, {name}! Die Uhrzeit ist {time.strftime('%H:%M:%S')}")

# Ein Timer-Objekt erstellen
t = threading.Timer(5, grüßen, args=["Alice"])

# Den Timer starten
t.start()

print("Timer gestartet!")

# Warten, bis der Timer fertig ist
t.join()

print("Timer abgeschlossen!")

Lassen Sie uns das aufbrechen:

  1. Wir importieren die notwendigen Module: threading und time.
  2. Wir definieren eine einfache grüßen-Funktion, die eine Begrüßung mit der aktuellen Uhrzeit ausgibt.
  3. Wir erstellen ein Timer-Objekt und sagen ihm, die grüßen-Funktion nach einer 5-sekündigen Verzögerung auszuführen und "Alice" als Argument zu übergeben.
  4. Wir starten den Timer mit t.start().
  5. Wir verwenden t.join(), um auf das Ende des Timers zu warten, bevor wir weitermachen.

Wenn du das ausführst, wirst du sofort "Timer gestartet!" sehen, dann nach einer 5-sekündigen Pause die Begrüßung und schließlich "Timer abgeschlossen!".

Einen Timer stornieren

Manchmal möchtest du vielleicht eine geplante Aufgabe stornieren. Es ist wie entscheiden, dass du diesen Wecker doch nicht brauchst. So geht das:

import threading
import time

def Aufgabe():
print("Diese Aufgabe wird nicht ausgeführt!")

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

print("Timer gestartet, aber wir stornieren ihn...")
time.sleep(2)  # Warten für 2 Sekunden
t.cancel()  # Timer stornieren
print("Timer storniert!")

In diesem Beispiel planen wir eine Aufgabe, stornieren sie jedoch, bevor sie ausgeführt wird.

Threads mit dem sched-Modul planen

Nun leveln wir auf und schauen uns das sched-Modul an. Wenn die Timer-Klasse wie ein einfacher Wecker ist, dann ist das sched-Modul wie eine vollständige Planungs-App!

Was ist das sched-Modul?

Das sched-Modul ermöglicht es dir, mehrere Ereignisse zu planen, die zu bestimmten Zeiten auftreten sollen. Es ist perfekt, wenn du eine komplexere Planung als eine einfache Verzögerung benötigst.

Wie man das sched-Modul verwendet

Lassen Sie uns ein Beispiel anschauen:

import sched
import time

# Ein Planer-Objekt erstellen
s = sched.scheduler(time.time, time.sleep)

def print_time(name):
print(f"Hallo, {name}! Die Uhrzeit ist {time.strftime('%H:%M:%S')}")

# Einige Ereignisse planen
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("Planer startet!")
s.run()
print("Planer abgeschlossen!")

Lassen Sie uns das aufbrechen:

  1. Wir erstellen ein Planer-Objekt mit sched.scheduler().
  2. Wir definieren eine einfache print_time-Funktion.
  3. Wir planen drei Ereignisse mit s.enter():
  • Das erste Argument ist die Verzögerung in Sekunden.
  • Das zweite ist die Priorität (niedrigere Zahlen = höhere Priorität).
  • Das dritte ist die auszuführende Funktion.
  • Das argument-Schlüsselwort ermöglicht es uns, Argumente an die Funktion zu übergeben.
  1. Wir starten den Planer mit s.run().

Wenn du das ausführst, wirst du Grußungen in 2-sekündigen Intervallen sehen.

Geplante Ereignisse stornieren

Genau wie mit dem Timer kannst du geplante Ereignisse in sched stornieren:

import sched
import time

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

def Aufgabe(name):
print(f"Hallo, {name}!")

ereignis1 = s.enter(2, 1, Aufgabe, argument=("Alice",))
ereignis2 = s.enter(4, 1, Aufgabe, argument=("Bob",))

print("Ereignisse geplant. Storniere Bob's Ereignis...")
s.cancel(ereignis2)

s.run()
print("Planer abgeschlossen!")

In diesem Beispiel planen wir zwei Ereignisse, stornieren jedoch das zweite, bevor wir den Planer starten.

Vergleich von Timer und sched

Hier ist eine schnelle Vergleich der beiden Methoden, die wir gelernt haben:

Feature Timer sched
Einfachheit Einfach, direkt Komplexer, aber mächtiger
Mehrere Ereignisse Ein Mal gleichzeitig Kann mehrere Ereignisse planen
Präzision Weniger präzise Mehr präzise
Stornierung Kann vor der Ausführung storniert werden Kann jederzeit storniert werden
Anwendungsfall Einfache Verzögerungen Komplexere Planungsbedürfnisse

Fazit

Und so ist es, Leute! Wir haben die Welt des Thread-Schedulings in Python erkundet, vom einfachen Timer-Klass zu dem komplexeren sched-Modul. Denke daran, dass das Erlernen dieser Konzepte wie das Radfahren ist, es erfordert Übung. Also mach dir keine Sorgen, experimentiere und mache Fehler - so lernen wir!

In meinen Jahren des Unterrichtens habe ich Studenten von völligen Anfängern zu Python-Profis werden sehen, und ich habe keinen Zweifel, dass du das gleiche schaffen kannst. Fange an zu coden, zu lernen und vor allem, hab Spaß dabei!

Bis zum nächsten Mal, happy coding!

Credits: Image by storyset