[리원아빠] 파이썬 GUI 환경 쓰레드 적용 응답없음 멈춤현상 해결책

2023. 1. 10. 15:56Python

반응형

 


파이썬 GUI 환경 쓰레드 적용해 응답없음 멈춤현상 해결하기



파이썬으로 GUI 환경의 프로그램을 코딩하다 보면

 

해당 프로그램이 실행되는 동안 프로그램창 상태가 응답없음 상태에 빠지곤 한다.

 

그 이유는 파이썬은 기본적으로 싱글 쓰레드 방식으로 프로그램이 구동되기 때문인데

 

쉽게 말하자면 해당 프로그램을 수행하기 위해 할당된 작업자가 한명이라 생각하면 된다.

 

작업자가 한명이기에 그 작업자에게 추가적인 작업을 요청하더라도

 

작업자가 수행하고 있는 작업을 마치기전까지는 그 어떤 작업도 추가로 할 수 없다는 의미이다.

 

비전공자들에겐 다소 어려운 이야기로 다가가올수 있는데 쉽게 생각해보자.

 

 

import time
from tkinter import *

def doRun():
    for i in range(10):
        print(i)
        time.sleep(2)

if __name__ == "__main__":
    mainWin = Tk()
    mainWin.geometry("500x200")
    mainWin.title("쓰레드 테스트")
    run = Button(mainWin, text="실행", width=500, height=200, command=doRun).pack()
    mainWin.mainloop()

위의 소스를 예시로 한번 살펴보자.

 

실행버튼을 누르면 프린트문을 출력하고 2초간 슬립하는 단순한 테스트 예제이다.

 

 

하지만 실행버튼을 누르고 프로그램이 시작되면 프로그램창이 응답 없음 상태에 빠지게 된다.

 

 왜 응답없음 상태에 빠지겐 된 것일까?

 

작성자가 싱글 쓰레드에 대해 예시를 든 작업자를 다시 떠올려보자.

 

해당 예제 코드는 싱글 쓰레드, 즉 작업자가 단 한명인 프로그램이다.

 

따라서 작업자는 실행버튼을 누르는 순간 반복문안의 출력문을 수행하고 슬립을 하기 때문에

 

우리가 해당 프로그램을 통해 추가로 작업을 내릴 수 없는 상태인 응답없음 상태가 되어버린 것이다.

 

 

반복문이 끝이나면 즉, 작업자가 우리가 지시했던 모든일을 마치면

 

프로그램창이 다시 정상상태로 돌아온다.

 

짧고 간단한 프로그램인 경우 그냥 기다리는것도 하나의 방법이겠지만

 

작업이 길고 반복해서 수행을 해야하는 프로그램일 경우 위와 같은 상황이 발생한다면 곤란하다.

 

 

import time
from tkinter import *
import threading

def startThread():
    thread = threading.Thread(target=doRun)
    thread.daemon = True
    thread.start()

def doRun():
    for i in range(10):
        print(i)
        time.sleep(2)

if __name__ == "__main__":
    mainWin = Tk()
    mainWin.geometry("500x200")
    mainWin.title("쓰레드 테스트")
    run = Button(mainWin, text="실행", width=500, height=200, command=startThread).pack()
    mainWin.mainloop()

기존 예제 소스에서 threading 모듈을 임포트하고 startThread 함수를 추가한 후,

 

실행버튼을 클릭했을 때 수행되는 함수를 doRun 함수에서 startThread 함수로 변경했다.

 

소스를 간단하게 설명하자면 startThread 함수는 작업자를 한명씩 할당하는 과정이라고 생각하면 된다.

 

기존 예제 소스에는 프로그램 시작부터 끝까지 작업자가 한명이였다면

 

수정된 예제 소스에는 실행버튼을 클릭할 때마다 작업자를 한명씩 할당하는 것이다.

 

그리고 할당된 작업자들은 실제 우리가 지시하고자 했던 일을 수행한다. (target=doRun 부분) 

 

 

수정된 예제 소스를 수행해보자.

 

수정된 예제 소스는 프로그램이 수행되는 도중에도 프로그램 창 상태가 응답없음으로 빠지지 않는다.

 

실행버튼을 눌러 새로운 작업자를 할당해 그작업자가 우리가 지시한 일을 수행하고 있기 때문이다.

 

너무나도 쉽고 빠르게 파이썬 GUI 환경의 응답없음 멈춤현상 해결 방법.

 

쓰레드 모듈을 이용하면 손쉽게 해결 가능하다.

 

그럼 끝.

반응형