Python - 주 스레드

안녕하세요, 모험하는 프로그래머 여러분! 오늘, 우리는 Python 스레드의 세계로 흥미진진한 여정을 떠날 것입니다. 주로 주 스레드에 집중해요. 여러분의 친절한 이웃 컴퓨터 과학 교사로서, 이 재미있는 주제를 안내해 드릴게요. 프로그래밍에 새로운 사람이라도 걱정하지 마세요 – 기본부터 시작해서 점차 고도를 올려갈 거예요. 그럼, 좋아하는 음료를 준비하고 편하게 앉아서 함께 던지자구요!

Python - Main Thread

주 스레드란 무엇인가요?

구체적인 내용에 들어가기 전에 스레드가 무엇인지 이해해봅시다. 책을 읽으면서 음악을 듣는 것을 상상해보세요. 여러분의 뇌는 두 가지 작업을 동시에 수행하고 있습니다 – 이는 프로그래밍에서 스레드가 어떻게 작동하는지와 비슷합니다. 주 스레드는 Python 스크립트를 실행할 때 시작되는 프로그램의 주 장면과 같습니다.

주 스레드의 활동

주 스레드가 어떻게 작동하는지 보기 위해 간단한 예제를 시작해봅시다:

import threading
import time

def print_current_thread():
print(f"Current thread: {threading.current_thread().name}")

print_current_thread()
time.sleep(2)
print("Main thread is still running!")

이 스크립트를 실행하면 다음과 같은 결과를 볼 수 있습니다:

Current thread: MainThread
Main thread is still running!

이 예제에서는 threading 모듈을 사용하여 현재 스레드에 대한 정보에 접근하고 있습니다. time.sleep(2) 함수는 프로그래밍 이야기에서 드라마틱한 일련 번호처럼 약간의 휴식을 추가하는 데 사용됩니다.

주 스레드에 접근하기

이제 주 스레드가 어떻게 작동하는지 본 후, 주 스레드에 직접 접근하는 방법을 배워봅시다. Python는 이를 위한 편리한 방법을 제공합니다:

import threading

main_thread = threading.main_thread()
print(f"Main thread name: {main_thread.name}")
print(f"Main thread ID: {main_thread.ident}")

이 스크립트는 다음과 같은 출력을 내보입니다:

Main thread name: MainThread
Main thread ID: 140735268892672

ident는 스레드의 고유한 식별자입니다. 이는 스레드의 사회 보호번호와 같아, 두 개의 스레드가 같은 ID를 가질 수 없습니다.

우리가 주 스레드에 있는지 확인하기

가끔, 여러분의 코드가 주 스레드에서 실행되고 있는지 확인하고 싶을 때가 있습니다. 이를 위해 다음과 같이 할 수 있습니다:

import threading

def am_i_main():
return threading.current_thread() == threading.main_thread()

print(f"Are we in the main thread? {am_i_main()}")

def not_main():
print(f"Are we in the main thread now? {am_i_main()}")

thread = threading.Thread(target=not_main)
thread.start()
thread.join()

이 스크립트는 다음과 같은 출력을 내보입니다:

Are we in the main thread? True
Are we in the main thread now? False

이 예제에서는 새로운 스레드를 생성하여 not_main() 함수를 실행합니다. 이 새로운 스레드에서 am_i_main()를 호출하면 False를 반환합니다.

Python에서 주 스레드의 행동

Python에서 주 스레드는 이해해야 할 중요한 행동이 있습니다. 이를 탐구해봅시다!

주 스레드와 프로그램 종료

주 스레드의 주요 행동 중 하나는 스레드가 실행을 완료하면 전체 Python 프로그램이 종료되는 것입니다. 이를 행동에서 확인해봅시다:

import threading
import time

def long_task():
print("Starting a long task...")
time.sleep(5)
print("Long task finished!")

thread = threading.Thread(target=long_task)
thread.start()

print("Main thread is done!")

이 스크립트를 실행하면 다음과 같은 결과를 볼 수 있습니다:

Starting a long task...
Main thread is done!

"Long task finished!" 메시지가 나타나지 않는 것을 알 수 있습니다. 이는 주 스레드가 완료되고 프로그램이 롤 작업이 완료되기 전에 종료되기 때문입니다.

데몬 스레드와 비데몬 스레드

주 스레드의 행동을 더 잘 이해하기 위해서는 데몬 스레드에 대해 이야기해야 합니다. 데몬 스레드는 프로그램이 종료되지 않도록 방해하지 않는 배경 작업입니다. 앞서의 예제를 수정해봅시다:

import threading
import time

def long_task():
print("Starting a long task...")
time.sleep(5)
print("Long task finished!")

thread = threading.Thread(target=long_task)
thread.daemon = True  # 스레드를 데몬으로 설정
thread.start()

print("Main thread is done!")

출력은 앞서와 같습니다. 그러나 thread.daemon = True 라인을 제거하면 다음과 같은 결과를 볼 수 있습니다:

Starting a long task...
Main thread is done!
Long task finished!

이는 비데몬 스레드(기본 설정)가 프로그램이 종료되지 않도록 방해하기 때문입니다.

주 스레드가 다른 스레드를 기다리기

많은 경우, 주 스레드가 프로그램을 종료하기 전에 다른 스레드가 완료되기를 기다리고 싶습니다. Python는 이를 위한 간단한 방법을 제공합니다:

import threading
import time

def task(name):
print(f"Task {name} starting...")
time.sleep(2)
print(f"Task {name} finished!")

threads = []
for i in range(3):
t = threading.Thread(target=task, args=(f"T{i}",))
threads.append(t)
t.start()

for t in threads:
t.join()

print("All tasks completed!")

이 스크립트는 다음과 같은 출력을 내보입니다:

Task T0 starting...
Task T1 starting...
Task T2 starting...
Task T0 finished!
Task T1 finished!
Task T2 finished!
All tasks completed!

join() 메서드는 각 스레드가 작업을 완료할 때까지 주 스레드를 기다리게 합니다.

유용한 스레드 메서드 표

다음은 우리가 논의한 일부 유용한 스레드 메서드와 몇 가지 더 있는 메서드의 표입니다:

메서드 설명
threading.current_thread() 현재 Thread 객체를 반환합니다
threading.main_thread() 주 Thread 객체를 반환합니다
Thread.start() 스레드의 활동을 시작합니다
Thread.join() 스레드가 종료될 때까지 기다립니다
Thread.is_alive() 스레드가 살아 있으면 True를 반환합니다
Thread.setDaemon(bool) 스레드의 데몬 플래그를 설정합니다

결론

축하합니다! 여러분은 Python 스레딩의 첫 걸음을 내딛었습니다. 우리는 주 스레드, 주 스레드에 접근하는 방법, 그 행동, 그리고 다른 스레드와의 상호작용을 다루었습니다. 기억해두세요, 스레딩은 복잡한 주제일 수 있지만, 연습을 통해 더 편안하게 적응할 수 있을 것입니다.

이번 주제를 마무리하며, 유명한 컴퓨터 과학자 앨런 케이의 명언을 떠올리게 됩니다: "미래를 예측하는 가장 좋은 방법은 그를 발명하는 것입니다." Python 스레딩에 대한 새로운 지식을 바탕으로, 여러분은 이제 놀라운 멀티 스레드 프로그램을 발명할 준비가 되었습니다!

코딩을 계속하고, 지속적으로 배우며, 가장 중요한 것은 즐기세요! 다음 번에 다시 만나요, 즐거운 스레딩 하세요!

Credits: Image by storyset