Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

파이썬 스레딩(Threading) 모듈 완벽 가이드

파이썬 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이 되면 자동으로 종료됩니다.