본문 바로가기
무모한 도전-주식 인공지능 만들기

QThread를 향한 공부

by 인터넷떠돌이 2019. 7. 25.
반응형

안녕하세요?

 

지난번 포스팅에서 멀티 프로세싱에서 한계가 있었지만, 한번 찾아보니까, PyQt5에서는 QThread라는 것을 기본적으로 지원하고 있으며, 이게 멀티 스레딩이 된다는 정보까지는 얻었습니다. 그래서 이번 포스팅에서는 이 QThread를 한번 공부해 보는 것으로 포스팅을 하고자 합니다.

 

먼저 연습을 위해서 MyStockTrader라는 프로젝트 안에서 위 스크린샷과 같이 multithread.py를 만들어 보도록 해야 합니다.

 

다음으로 일단 인터넷에 나와 있는 코드를 그대로 옮겨 오도록 합니다. 이 코드는 윈도우 창을 하나 띄우고, 시간이 지나면서 카운트가 올라가는 카운터가 있으며, 버튼이 하나 있는 식으로 있습니다.

 

그리고 나서 버튼을 누르면 위 스크린샷과 같이 sleep명령어를 줘서 5초간 뭐추어 있도록 만들어 주도록 합니다. 이렇게 해서 원래는 없던 if __name__ == "__main__": 이라고 넣어 주어서 실행을 시켜 보도록 합니다.

 

 

그러자 위 스크린샷처럼 일단 윈도우가 나오기는 나오고, 다음으로는 이 DANGER! 라는 버튼을 눌렀을 때, 제대로 윈도우가 5초간 얼어버리는 현상을 볼 수 있었습니다.

 

이런 현상을 막아보고자 있다는 것이 위 스크린샷처럼 일단 Worker라고 하는 QRunnable이라는 클래스를 바로 만들어 주어서, 여기서 GUI의 스레드 말고 다른 스레드를 만들어서 따로 작동하도록 만들어 주도록 하는 것 입니다.

 

다음으로는 기존의 QMainWindow에서 QThreadPool()이라는 명령을 추가시켜 주도록 합니다. 이렇게 해서 위 스크린샷의 붉은 박스안에 있는 내용을 적어 주도록 합니다.

 

그리고 나서 기존에 있던 Danger버튼은 위 스크린샷과 같이 바꾸어 주도록 하는데, 버튼을 누르면 다른 스레드가 시작이 되도록 명령을 바꾸는 것 입니다.

 

이렇게 코드를 바꾸고 나서 실행을 시키니, DANGER! 라는 버튼을 눌러도 이전처럼 GUI가 멈추는 현상 = 얼어버리는 현상이 발생하지 않았습니다.

 

그리고 버튼을 한번씩만 5초 간격으로 누르면, 위 스크린샷과 같이 스레드가 시작했다가 끝나는 패턴을 반복해서 보여주고 있습니다.

 

그런데 진짜로 4개의 스레드가 한계라고 정해져 있는 것은 사실인 것인지, 일단 위 스크린샷을 보시면 4번 버튼을 연달아서 누르면 제대로 한꺼번에 실행이 되는데, 문제는 5번째는 4번째 스레드까지 모두 끝난 다음에야 실행이 되는 것을 확인할 수 있었습니다.

반응형