이 글에서는 하나의 프로그램에서 두 가지 작업을 동시에 수행하는 방법을 다룹니다. 하나는 포그라운드에서 실행되고, 다른 하나는 백그라운드에서 실행됩니다. 구체적으로는 백그라운드 스레드가 파일에 내용을 기록하는 동안, 메인 스레드에서는 사용자가 입력한 숫자가 홀수인지 짝수인지 판별합니다.
멀티스레딩이란?
Python에서 하나의 프로그램 안에서 여러 작업을 동시에 처리하려면 멀티스레딩(Multithreading)을 활용할 수 있습니다. threading 모듈을 사용하면 별도의 스레드를 생성해 시간이 오래 걸리는 작업(예: 파일 입출력)을 백그라운드로 넘기고, 메인 프로그램은 계속해서 다른 작업을 진행할 수 있습니다.
예제 코드
import threading
import time
class AsyncWrite(threading.Thread):
def __init__(self, text, out):
threading.Thread.__init__(self)
self.text = text
self.out = out
def run(self):
f = open(self.out, "a")
f.write(self.text + '\n')
f.close()
time.sleep(3)
print("Finished Background file write to " + self.out)
def Main():
message = input("Enter a string to store:")
background = AsyncWrite(message, 'out.txt')
background.start()
print("The program can continue while it writes in another thread")
num = int(input("Entered number is : "))
if (num % 2 == 0):
print("Entered number is Even")
else:
print("Entered number is ODD")
background.join()
print("Waited until thread was complete")
if __name__ == '__main__':
Main()코드 설명
1. AsyncWrite 클래스 정의
AsyncWrite 클래스는 threading.Thread를 상속받아 정의된 커스텀 스레드 클래스입니다. 생성자(__init__)에서 파일에 저장할 텍스트(text)와 대상 파일 경로(out)를 전달받아 저장합니다.
2. run() 메서드 — 백그라운드 작업
run() 메서드에는 실제 백그라운드에서 수행할 작업이 담겨 있습니다. 지정한 파일을 추가 모드(a)로 열어 텍스트를 한 줄씩 기록한 뒤 파일을 닫고, 3초간 대기 후 작업 완료 메시지를 출력합니다.
3. 메인 함수의 흐름
Main() 함수에서는 먼저 사용자로부터 저장할 문자열을 입력받고, 이를 인자로 하는 AsyncWrite 객체를 생성합니다. 그다음 start()를 호출하면 백그라운드 스레드가 파일 쓰기를 시작하고, 메인 프로그램은 멈추지 않고 계속 진행됩니다. 이어서 숫자를 입력받아 나머지 연산자(%)로 2를 나누어 홀수인지 짝수인지 판별합니다.
4. join()으로 스레드 종료 대기
join() 메서드는 백그라운드 스레드의 작업이 끝날 때까지 메인 프로그램의 실행을 잠시 멈춥니다. 이를 통해 파일 쓰기 작업이 완전히 마무리된 후 프로그램이 종료되도록 보장할 수 있습니다.
실행 결과
Enter a string to store:Tutorialspoint The program can continue while it writes in another thread Entered number is : 33 Entered number is ODD Finished Background file write to out.txt Waited until thread was complete
실행 결과를 보면, 백그라운드 스레드가 파일에 문자열을 쓰는 동안에도 메인 프로그램이 즉시 다음 단계(숫자 입력 및 홀짝 판별)로 넘어간 것을 확인할 수 있습니다. 마지막에 join() 덕분에 백그라운드 파일 쓰기가 완료된 후에야 "Waited until thread was complete" 메시지가 출력되며 프로그램이 종료됩니다.
마무리
이처럼 Python의 threading 모듈을 활용하면 파일 쓰기처럼 시간이 걸리는 작업을 백그라운드로 처리하면서도, 사용자와의 상호작용 같은 다른 작업을 동시에 수행할 수 있습니다. 응답성이 중요한 프로그램을 개발할 때 멀티스레딩은 매우 유용한 기법입니다.