파이썬 - 스레드 중단

안녕하세요, 파이썬 프로그래머를 꿈꾸는 여러분! 오늘은 파이썬에서 스레드를 중단하는 흥미로운 주제에 대해 다룰 것입니다. 프로그래밍에 새로운 사람이라도 걱정하지 마세요; 저는 여러분을 단계별로 이 여정을 안내해 드릴 것입니다. 여러분과 함께 이 모험을 시작해 보겠습니다!

Python - Interrupting a Thread

스레드란 무엇인가요?

스레드를 중단하기 전에, 스레드가 무엇인지 빠르게 복습해 보겠습니다. 책을 읽고 있는 중에 갑자기 전화를 걸어야 하는 것을 상상해 보세요. 페이지에 책갈피를 꽂아(스레드를 만듭니다), 전화를 거시고, 다시 책으로 돌아가세요. 이와 비슷하게 프로그래밍에서 스레드는 프로그램이 동시에 여러 가지 일을 할 수 있게 합니다.

스레드 중단

이제, 전화를 거는 중에 너무 오래 걸리고 책을 돌아가고 싶다고 가정해 보겠습니다. 전화를 어떻게 예의 있게 끊을까요? 이때 스레드 중단이 들어옵니다. 파이썬에서는 이를 위해 몇 가지 방법이 있습니다:

  1. 이벤트 객체 사용
  2. 플래그 사용

이 두 가지 방법을 몇 가지 재미있는 예제를 통해 탐구해 보겠습니다!

이벤트 객체를 사용한 스레드 중단

이벤트 객체는 설정하거나 지울 수 있는 플래그입니다. 플래그가 설정되면 스레드에 중단 신호를 보냅니다.

다음은 간단한 예제입니다:

import threading
import time

def worker(event):
while not event.is_set():
print("Working...")
time.sleep(1)
print("Worker: I'm done!")

# 이벤트 객체 생성
stop_event = threading.Event()

# 스레드 생성 및 시작
thread = threading.Thread(target=worker, args=(stop_event,))
thread.start()

# 스레드를 5초 동안 실행
time.sleep(5)

# 이벤트를 설정하여 스레드를 중단하게 함
stop_event.set()

# 스레드가 끝날 때까지 기다림
thread.join()

print("Main: All done!")

이 코드를 분석해 보겠습니다:

  1. 필요한 모듈을 임포트합니다: threading은 스레드 작업에 사용하고, time은 지연을 추가하는 데 사용합니다.
  2. worker 함수를 정의하여 이벤트가 설정되지 않은 동안 작업을 계속합니다.
  3. Event 객체를 stop_event라는 이름으로 생성합니다.
  4. 스레드를 생성하고 시작하며, stop_event를 인자로 전달합니다.
  5. time.sleep(5)를 사용하여 스레드를 5초 동안 실행합니다.
  6. stop_event.set()를 사용하여 이벤트를 설정하여 스레드를 중단하게 합니다.
  7. thread.join()를 사용하여 스레드가 끝날 때까지 기다립니다.

이 코드를 실행하면 "Working..."가 여러 번 출력된 후 "Worker: I'm done!"와 "Main: All done!"가 출력됩니다.

플래그를 사용한 스레드 중단

스레드를 중단하는 또 다른 방법은 간단한 부울 플래그를 사용하는 것입니다. 이 방법은 약간 더 수동적이지만, 매우 효과적일 수 있습니다.

다음은 예제입니다:

import threading
import time

def counting_sheep(stop_flag):
count = 0
while not stop_flag[0]:
count += 1
print(f"Counting sheep: {count}")
time.sleep(1)
print(f"I counted {count} sheep before falling asleep!")

# 플래그를 저장할 수 있는 가변 객체 생성
stop_flag = [False]

# 스레드 생성 및 시작
thread = threading.Thread(target=counting_sheep, args=(stop_flag,))
thread.start()

# 스레드가 양을 세는 데 5초 동안 기다림
time.sleep(5)

# 스레드를 중단하려고 플래그를 True로 설정
stop_flag[0] = True

# 스레드가 끝날 때까지 기다림
thread.join()

print("Main: Sweet dreams!")

이 코드를 분석해 보겠습니다:

  1. counting_sheep 함수를 정의하여 stop_flag가 True로 설정되지 않은 동안 양을 세어갑니다.
  2. 부울 값을 저장할 수 있는 리스트 stop_flag를 생성합니다. 리스트는 가변적이므로 스레드 외부에서 수정할 수 있습니다.
  3. 스레드를 생성하고 시작하며, stop_flag를 인자로 전달합니다.
  4. 스레드가 양을 세는 데 5초 동안 기다립니다.
  5. stop_flag[0]를 True로 설정하여 스레드를 중단하게 합니다.
  6. thread.join()를 사용하여 스레드가 끝날 때까지 기다립니다.

이 코드를 실행하면 양을 세는 중에 약 5초 동안 증가한 후, 최종 수와 함께 "I counted {count} sheep before falling asleep!"와 "Main: Sweet dreams!"가 출력됩니다.

방법 비교

이 두 가지 방법을 비교해 보겠습니다:

방법 장점 단점
이벤트 객체 - 내장된 동기화
- 명확하고 파이썬식
- 이벤트 객체를 전달해야 합니다
플래그 - 간단하게 구현 가능
- 추가적인 객체 필요하지 않음
- 수동 동기화
- 경쟁 조건 발생 가능

결론

축하합니다! 여러분은 파이썬에서 스레드를 중단하는 두 가지 방법을 배웠습니다. 이벤트 객체 방법은 일반적으로 내장된 동기화 덕분에 선호됩니다만, 플래그 방법은 더 간단한 시나리오에서 유용할 수 있습니다.

기억해 주세요, 전화를 예의 있게 끊는 것처럼, 스레드가 중단되기 전에 정리할 수 있는 기회를 주는 것이 중요합니다. 실제 응용 프로그램에서는 스레드 함수에 정리 코드를 추가하여 중단 신호가 수신되었을 때 실행되도록 할 수 있습니다.

프로그래밍은 모두 연습에 의해 이루어진 것이므로, 이 예제를 실험해 보시기를 권장합니다. 여러분은 여러 스레드를 추가하거나 시간을 변경하는 것을 시도해 볼 수 있습니다.谁知道? "양 세기를 방해하는 게임"을 만들 수도 있습니다!

코딩 잘하시고, 여러분의 스레드가 항상 협력하길 바랍니다!

Credits: Image by storyset