[파이썬] 파이썬 내장 모듈인 threading 사용

파이썬은 멀티스레딩을 지원하기 위해 threading이라는 내장 모듈을 제공합니다. 이 모듈을 사용하면 병렬로 실행되는 여러 개의 스레드를 관리할 수 있습니다. 스레드는 동시에 여러 작업을 수행하는 데 사용되며, 시간이 오래 걸리는 작업을 처리하거나 프로그램의 반응성을 향상시킬 때 유용합니다.

스레드 생성하기

threading 모듈을 사용하여 스레드를 생성하려면 Thread 클래스의 서브클래스를 만들고, run 메소드를 구현해야 합니다. run 메소드는 스레드가 실행할 코드를 정의합니다.

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

import threading

class MyThread(threading.Thread):
    def run(self):
        # 스레드가 실행할 코드 작성
        print("스레드 실행 중")

# 스레드 인스턴스 생성
my_thread = MyThread()

# 스레드 시작
my_thread.start()

# 스레드가 종료될 때까지 기다리기
my_thread.join()

print("프로그램 종료")

위의 예제는 MyThread 클래스를 정의하고 run 메소드를 구현한 후, MyThread 클래스의 인스턴스를 생성하여 스레드를 시작하는 방법을 보여줍니다. start 메소드를 호출하면 새로운 스레드가 생성되어 run 메소드가 실행되고, join 메소드를 호출하여 해당 스레드의 종료를 기다립니다.

스레드 동기화

여러 개의 스레드가 동시에 어떤 리소스에 접근하려고 할 때, 동기화가 필요합니다. 파이썬 threading 모듈은 스레드 간의 동기화를 위한 여러 가지 도구를 제공합니다.

가장 일반적인 동기화 도구인 Lock을 사용하는 예를 살펴보겠습니다.

import threading

# Lock 객체 생성
lock = threading.Lock()

# 공유 변수
shared_value = 0

class MyThread(threading.Thread):
    def run(self):
        global shared_value

        # Lock을 획득
        lock.acquire()

        try:
            # 임계영역에 접근하여 작업 수행
            shared_value += 1
            print("스레드 %s: 공유 변수 값 증가" % self.name)
        finally:
            # Lock을 해제
            lock.release()

# 스레드 인스턴스 생성
thread1 = MyThread()
thread2 = MyThread()

# 스레드 시작
thread1.start()
thread2.start()

# 스레드가 종료될 때까지 기다리기
thread1.join()
thread2.join()

print("최종 공유 변수 값:", shared_value)

위의 예제는 Lock 객체를 사용하여 스레드 간의 접근을 순차적으로 제어하는 방법을 보여줍니다. lock.acquire()를 호출하여 Lock을 획득하고, 임계영역에서 작업을 수행한 후 lock.release()를 호출하여 Lock을 해제합니다.

이외에도 파이썬 threading 모듈은 Semaphore, Condition, Event 등 다양한 동기화 도구를 제공합니다. 필요에 따라 적절한 동기화 도구를 선택하여 스레드 간의 상호작용을 조율할 수 있습니다.

결론

threading 모듈을 사용하면 파이썬에서 멀티스레딩을 쉽게 구현할 수 있습니다. 스레드를 이용하여 시간이 오래 걸리는 작업을 비동기적으로 처리하거나, 프로그램의 반응성을 향상시킬 수 있습니다. 동시에 여러 작업을 수행해야 할 때는 동기화 도구를 사용하여 스레드의 접근을 제어해야 합니다.