Python - 스레드 스케줄링

안녕하세요, 미래의 Python 마에스토들! 오늘은 Python에서 스레드 스케줄링의 흥미로운 세계에 빠지러 가요. 프로그래밍에 새로운 사람이라도 걱정하지 마세요; 저는 수년간 학생들을 가르쳐 왔던 것처럼, 단계별로 안내해 드릴게요. 이 흥미진진한 모험을 함께 시작해볼까요!

Python - Thread Scheduling

스레드 이해하기

스케줄링에 뛰어들기 전에, 스레드가 무엇인지 빠르게 복습해볼게요. 책을 읽으면서 음악을 듣는 것을 상상해보세요. 당신의 뇌는 실제로 두 개의 "스레드"를 동시에 실행하고 있습니다 - 하나는 읽기용, 하나는 듣기용. 프로그래밍에서는 스레드가 비슷하게 작동하여, 프로그램이 여러 작업을 동시并发적으로 수행할 수 있습니다.

Timer 클래스를 사용하여 스레드 스케줄링

이제, 우리의 첫 번째 스케줄링 방법을 탐구해볼까요: Timer 클래스입니다. 이것은 코드에 알람 시계를 설정하는 것과 같아요!

Timer 클래스란?

Timer 클래스는 Python의 threading 모듈의 일부입니다. 지정된 지연 후에 함수를 실행하도록 예약할 수 있습니다. 이를 "이 작업을 해줘, 하지만 시작하기 전에 잠깐 기다려!"라고 Python에 말하는 것과 같습니다.

Timer 클래스 사용법

간단한 예제를 살펴보겠습니다:

import threading
import time

def greet(name):
print(f"Hello, {name}! The time is {time.strftime('%H:%M:%S')}")

# Timer 객체 생성
t = threading.Timer(5, greet, args=["Alice"])

# 타이머 시작
t.start()

print("Timer started!")

# 타이머가 끝날 때까지 기다리기
t.join()

print("Timer completed!")

이를 분석해보겠습니다:

  1. 필요한 모듈을 임포트합니다: threadingtime.
  2. 간단한 greet 함수를 정의하여 인사와 현재 시간을 인쇄합니다.
  3. Timer 객체를 생성하여, 5초 지연 후에 greet 함수를 실행하도록 지시하고, "Alice"를 인수로 전달합니다.
  4. 타이머를 t.start()로 시작합니다.
  5. t.join()를 사용하여 타이머가 완료될 때까지 기다립니다.

이를 실행하면 "Timer started!"가 즉시 인쇄되고, 5초 지연 후에 인사가 인쇄되고, "Timer completed!"가 나중에 인쇄됩니다.

타이머 취소하기

가끔, 예약된 작업을 취소해야 할 때가 있습니다. 그것은 알람을 끄는 것과 같아요. 이렇게 하면 됩니다:

import threading
import time

def task():
print("This task won't run!")

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

print("Timer started, but we'll cancel it...")
time.sleep(2)  # 2초 기다리기
t.cancel()  # 타이머 취소
print("Timer cancelled!")

이 예제에서는 작업을 예약한 후, 실행되기 전에 취소합니다.

sched 모듈을 사용하여 스레드 스케줄링

이제, sched 모듈을 살펴보겠습니다. Timer 클래스는 간단한 알람 시계와 비슷하지만, sched 모듈은 완벽한 스케줄링 앱과 비슷합니다!

sched 모듈이란?

sched 모듈은 여러 이벤트가 특정 시간에 발생하도록 예약할 수 있게 해줍니다. 간단한 지연보다 더 복잡한 스케줄링이 필요할 때에 적합합니다.

sched 모듈 사용법

예제를 살펴보겠습니다:

import sched
import time

# 스케줄러 객체 생성
s = sched.scheduler(time.time, time.sleep)

def print_time(name):
print(f"Hello, {name}! The time is {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("Scheduler starting!")
s.run()
print("Scheduler completed!")

이를 분석해보겠습니다:

  1. sched.scheduler()를 사용하여 스케줄러 객체를 생성합니다.
  2. 간단한 print_time 함수를 정의합니다.
  3. 세 가지 이벤트를 s.enter()를 사용하여 예약합니다:
  • 첫 번째 인수는 초 단위의 지연 시간입니다.
  • 두 번째는 우선순위입니다 (낮은 번호 = 높은 우선순위).
  • 세 번째는 실행할 함수입니다.
  • argument 키워드는 함수에 인수를 전달할 수 있게 합니다.
  1. s.run()으로 스케줄러를 시작합니다.

이를 실행하면 2초 간격으로 인사가 인쇄됩니다.

예약된 이벤트 취소하기

Timer와 마찬가지로, sched에서 예약된 이벤트를 취소할 수 있습니다:

import sched
import time

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

def task(name):
print(f"Hello, {name}!")

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

print("Events scheduled. Cancelling Bob's event...")
s.cancel(event2)

s.run()
print("Scheduler completed!")

이 예제에서는 두 가지 이벤트를 예약한 후, 스케줄러를 실행하기 전에 두 번째 이벤트를 취소합니다.

Timer와 sched 비교

우리가 배운 두 가지 방법의 비교를 간단히 보겠습니다:

특징 Timer sched
사용 쉬움 간단하고 직관적 더 복잡하지만 더 강력
여러 이벤트 한 번에 하나 여러 이벤트를 예약할 수 있음
정밀도 덜 정밀 더 정밀
취소 실행 전에 취소 가능 언제든지 취소 가능
사용 사례 간단한 지연 복잡한 스케줄링 필요

결론

그렇게, 여러분! 우리는 Python에서 스레드 스케줄링의 세계를 Timer 클래스에서부터 더 복잡한 sched 모듈까지 여행했습니다. 기억해요, 바이크를 타는 것처럼, 이러한 개념을 마스터하기 위해서는 연습이 필요합니다. 그래서 실험하고 실수를 할 때까지 두려워마세요 - 그게 우리가 배우는 방법입니다!

저는 수년간 학생들을 가르쳐 왔을 때, 완전한 초보자에서 Python 전문가로 성장한 학생들을 본 적이 있으며, 여러분도 똑같이 할 수 있다는 믿음을 가지고 있습니다. 계속 코딩하고, 계속 배우며, 가장 중요한 것은 그 과정에서 즐기세요!

다음 번에 뵙겠습니다, 즐거운 코딩 하세요!

Credits: Image by storyset