파이썬 - 스레드 생성
안녕하세요, 파이썬 프로그래머를 꿈꾸시는 여러분! 오늘은 흥미로운 스레드 세계에 뛰어들어보겠습니다. 스레드에 대해 들어보지 않았던 건 두렵지 않습니다. 저희는 맨 앞부터 시작하여 점차 고도를 끌어올릴 것입니다. 이 튜토리얼을 끝내면, 여러분도 전문가처럼 스레드를 생성할 수 있을 거예요!
스레드란 무엇인가요?
스레드를 생성하기 전에, 스레드가 무엇인지 이해해보겠습니다. 복잡한 요리를 만들고 있다고 상상해보세요. 모든 것을 순서대로 하지 않죠. 한 번에 파스타를 살짝 살짝 끓이면서, 다른 쪽에서 채소를 자르고 있을 수도 있습니다. 이는 프로그래밍에서 스레드가 어떻게 동작하는지와 비슷합니다. 스레드는 프로그램의 다른 부분을 동시에 실행할 수 있게 해주며, 코드의 효율성을 높여줍니다.
함수를 사용하여 스레드 생성
파이썬에서 스레드를 생성하는 가장 간단한 방법은 함수를 사용하는 것입니다. 기본적인 예제를 시작해보겠습니다:
import threading
import time
def print_numbers():
for i in range(5):
print(f"Number {i}")
time.sleep(1)
# 스레드 생성
thread = threading.Thread(target=print_numbers)
# 스레드 시작
thread.start()
print("Main thread continues to run")
# 스레드가 끝날 때까지 기다리기
thread.join()
print("Thread has finished")
이 코드를 분석해보겠습니다:
-
threading
모듈을 임포트하여 스레드 작업을 위한 도구를 제공받습니다. - 간단한
print_numbers()
함수를 정의하여 0에서 4까지의 숫자를 인쇄하고, 각 인쇄 사이에 1초씩 지연시킵니다. -
threading.Thread()
를 사용하여 스레드를 생성하고, 우리의 함수를target
으로 지정합니다. -
thread.start()
를 사용하여 스레드를 시작합니다. - 주 프로그램은 계속 실행되며 "Main thread continues to run"를 인쇄합니다.
-
thread.join()
를 사용하여 스레드가 끝날 때까지 기다립니다.
이 코드를 실행하면, "Main thread continues to run"가 즉시 인쇄되고, 배경에서 숫자가 인쇄되는 것을 볼 수 있습니다. 이것이 스레드의 힘입니다!
Thread 클래스 확장하여 스레드 생성
스레드를 생성하는 또 다른 방법은 Thread
클래스를 확장하는 것입니다. 이 방법은 재사용 가능한 스레드 객체를 생성하고 싶을 때 유용합니다. 예제를 보겠습니다:
import threading
import time
class NumberPrinter(threading.Thread):
def __init__(self, name):
threading.Thread.__init__(self)
self.name = name
def run(self):
for i in range(5):
print(f"{self.name}: Number {i}")
time.sleep(1)
# 두 개의 스레드 생성
thread1 = NumberPrinter("Thread 1")
thread2 = NumberPrinter("Thread 2")
# 스레드 시작
thread1.start()
thread2.start()
print("Main thread continues to run")
# 두 스레드가 모두 끝날 때까지 기다리기
thread1.join()
thread2.join()
print("Both threads have finished")
이 예제에서:
-
NumberPrinter
클래스를 정의하여threading.Thread
를 확장합니다. -
__init__
메서드를 재정의하여 스레드에 이름을 전달합니다. - 스레드가 시작될 때 호출되는
run
메서드를 재정의합니다. -
NumberPrinter
클래스의 두 개의 인스턴스를 생성하고 시작합니다. - 두 스레드는 동시에 실행되며, 자신의 숫자를 인쇄합니다.
이 방법은 우리에게 스레드에 대한 더 많은 제어를 제공하며, 쉽게 여러 인스턴스를 생성할 수 있습니다.
start_new_thread() 함수를 사용하여 스레드 생성
파이썬에서 스레드를 생성하는 세 번째 방법은 _thread
모듈의 start_new_thread()
함수를 사용하는 것입니다. 그러나 이 방법은 낮은 수준의 방법으로 간주되며, 대부분의 사용 사례에는 권장되지 않습니다. 완전성을 위해 예제를 제공하겠습니다:
import _thread
import time
def print_numbers(thread_name):
for i in range(5):
print(f"{thread_name}: Number {i}")
time.sleep(1)
# 두 개의 새로운 스레드 시작
try:
_thread.start_new_thread(print_numbers, ("Thread 1",))
_thread.start_new_thread(print_numbers, ("Thread 2",))
except:
print("Error: unable to start thread")
# 주 스레드를 살리기
time.sleep(6)
print("Main thread exiting")
이 방법은 덜 유연하며, 이전의 방법보다는 덜 많은 제어를 제공합니다. 또한, 이 접근 방식을 사용하여 스레드가 완료될 때까지 기다리는 것이 더 어렵습니다.
스레드 생성 방법 비교
여기서는 우리가 논의한 세 가지 방법을 간략히 비교해보겠습니다:
방법 | 장점 | 단점 |
---|---|---|
함수 사용 | 구현 간단, 일회성 작업에 적합 | 재사용성 떨어짐, 제한된 제어 |
Thread 클래스 확장 | 재사용 가능, 더 많은 제어, 오브젝트 지향 | 설정이 약간 더 복잡 |
start_new_thread() | 낮은 수준의 제어 | 관리 어려움, 유연성 떨어짐, 권장되지 않음 |
결론
축하합니다! 여러분은 파이썬에서 스레드의 세계에 첫 걸음을 내딛었습니다. 우리는 세 가지 다른 방법으로 스레드를 생성하는 방법을 다루었으며, 각각의 장점과 사용 사례를 다루었습니다. 기억해두세요, 스레드는 프로그램의 효율성을 높일 수 있지만, 복잡성을 도입합니다. 파이썬의 여정을 계속하면서, 스레드를 언제와 어떻게 효과적으로 사용하는지 더 많이 배우실 거예요.
계속 연습하시고, 곧 능숙한 프로그래머처럼 스레드를 사용하실 수 있을 거예요. 코딩 잘 하세요!
Credits: Image by storyset