파이썬 2.4부터 기본 포함된 threading 모듈은 이전에 소개한 저수준 thread 모듈보다 훨씬 강력하고 고수준의 스레드 지원 기능을 제공합니다. 실무에서는 대부분 이 threading 모듈을 사용하는 것이 권장됩니다.
threading 모듈은 thread 모듈의 모든 메서드를 그대로 노출하며, 추가로 다음과 같은 유용한 함수들을 제공합니다.
- threading.activeCount() — 현재 활성 상태인 스레드 객체의 개수를 반환합니다.
- threading.currentThread() — 호출자의 스레드 제어 범위 내에 있는 스레드 객체 수를 반환합니다.
- threading.enumerate() — 현재 활성화되어 있는 모든 스레드 객체의 목록을 반환합니다.
Thread 클래스의 주요 메서드
함수들 외에도 threading 모듈에는 스레딩을 구현하는 Thread 클래스가 포함되어 있습니다. Thread 클래스에서 제공하는 메서드는 다음과 같습니다.
- run() — 스레드의 진입점(entry point) 역할을 하는 메서드입니다.
- start() — run() 메서드를 호출하여 스레드를 시작합니다.
- join([time]) — 스레드가 종료될 때까지 대기합니다.
- isAlive() — 스레드가 아직 실행 중인지 여부를 확인합니다.
- getName() — 스레드의 이름을 반환합니다.
- setName() — 스레드의 이름을 설정합니다.
Threading 모듈로 스레드 생성하기
threading 모듈을 사용해 새로운 스레드를 구현하려면 다음 단계를 따르면 됩니다.
- Thread 클래스의 새로운 하위 클래스(subclass)를 정의합니다.
__init__(self [,args])메서드를 오버라이드하여 필요한 추가 인자를 받도록 합니다.run(self [,args])메서드를 오버라이드하여 스레드가 시작될 때 수행할 작업을 구현합니다.
새로운 Thread 하위 클래스를 만든 후에는 해당 클래스의 인스턴스를 생성하고, start() 메서드를 호출하면 됩니다. start()가 내부적으로 run() 메서드를 호출하여 새 스레드가 실행됩니다.
예제 코드
다음은 두 개의 스레드를 생성하고 실행하는 예제입니다. 최신 파이썬 3 문법으로 작성되었습니다.
#!/usr/bin/python3
import threading
import time
exitFlag = 0
class myThread(threading.Thread):
def __init__(self, threadID, name, counter):
threading.Thread.__init__(self)
self.threadID = threadID
self.name = name
self.counter = counter
def run(self):
print("Starting " + self.name)
print_time(self.name, 5, self.counter)
print("Exiting " + self.name)
def print_time(threadName, counter, delay):
while counter:
if exitFlag:
threadName.exit()
time.sleep(delay)
print("%s: %s" % (threadName, time.ctime(time.time())))
counter -= 1
# 새 스레드 생성
thread1 = myThread(1, "Thread-1", 1)
thread2 = myThread(2, "Thread-2", 2)
# 새 스레드 시작
thread1.start()
thread2.start()
print("Exiting Main Thread")위 코드를 실행하면 다음과 같은 결과가 출력됩니다. 두 스레드가 번갈아 가며 실행되는 것을 확인할 수 있습니다.
Starting Thread-1 Starting Thread-2 Exiting Main Thread Thread-1: Thu Mar 21 09:10:03 2013 Thread-1: Thu Mar 21 09:10:04 2013 Thread-2: Thu Mar 21 09:10:04 2013 Thread-1: Thu Mar 21 09:10:05 2013 Thread-1: Thu Mar 21 09:10:06 2013 Thread-2: Thu Mar 21 09:10:06 2013 Thread-1: Thu Mar 21 09:10:07 2013 Exiting Thread-1 Thread-2: Thu Mar 21 09:10:08 2013 Thread-2: Thu Mar 21 09:10:10 2013 Thread-2: Thu Mar 21 09:10:12 2013 Exiting Thread-2
실행 결과를 보면 메인 스레드가 먼저 종료되더라도 자식 스레드들은 각자의 작업을 계속 수행하다가 종료되는 것을 알 수 있습니다. 각 스레드는 지정된 딜레이(delay) 간격마다 현재 시간을 출력하며, 카운터가 0이 되면 자동으로 종료됩니다.