본문 바로가기
대동단결 Python

QThread 분산처리 : 작업처리후 자동소멸

by 즐거운 지니 2021. 11. 5.
반응형

PyQt5 GUI환경에서 작업이 비동기적으로 실행되어야 하거나, 분산처리 되어야 할 경우 Threading.Thread() 보다는 PyQt5.QtCore.QThread()를 이용하는 것이 바른 선택인것 같다. 왜냐하면 PyQt5 GUI 환경하에서 Threading.Thread 오브젝트가 작업량이 많아 시간이 수초 이상 소요되는경우에는 GUI 환경이 종종 '응답없음' 상태로 빠지기 때문이다. 

이번 코드는

QThread로 정의된 쓰레드 워커(worker)들을 실행하면 스스로 실행을 마친 후 소멸하도록 한다. 

 

필요한 모듈들

import sys

from PyQt5.QtCore import QThread, QMutex
from PyQt5.QtWidgets import QApplication

 

QThread 만들기

class Worker(QThread):
    dataLock = QMutex()
    data = 0

    def __init__(self,num):
        super(Worker, self).__init__()
        self.num = num
        print(f'Woker {self.num} 생성')

    def __del__(self):
        print(f'Worker {self.num} 소멸')

    def run(self) -> None:
        Worker.dataLock.lock()
        Worker.data += 1
        Worker.dataLock.unlock()
        print(f'data = {Worker.data}')
        self.__del__()
  • QThread를 상속받아 Woker 클래스를 정의한다.
  • 여러개의 쓰레드 객체(Worker instance들)이 클래스변수 data를 공유하기 위해 dataLock를 만든다. Qmudex()는 Threading.Lock()와 같은 기능을 한다. 
  • 쓰레드 객체들의 구별을 위해 self.num을 두었다. 
  • 생성자와 소멸자를 정의하여 쓰레드 객체가 생성되거나 소멸될 때를 관찰할 수 있게 한다.
  • run() abstract 메쏘드를 구현하여 쓰레드로 작업할 일을 정의한다. 여기서는 공유데이터 data의 값을 1 증가하고 1초후 작업을 종료한다.
  • self.__del__()를 이용하여 객체를 스스로 소멸시킨다.

 

쓰레드로 병렬작업하기

app = QApplication(sys.argv)
for i in range(100):
    worker = Worker(i)
    worker.setParent(app) 
    worker.start()

app.exec_()
  • worker = Worker(i) : 쓰레드 객체 생성. for loop를 이용하여 모두 100개 생성.
  • worker.setParent(app) : 생성된 쓰레드객체의 부모를 지정하여 객체의 scope를지정한다. 지정된 부모객체가 소멸되면 비록 작업중이어도 모든 해당 쓰레드는 소멸된다. 부모를 지정하지 않으면 최 내부 지역 scope 으로 자동 지정된다. 따라서 그경우 for 루프가 종료되면 모두 소멸된다. (심지어 생성될 시간 조차 없어서 생성도 안 될 수 있다.)
  • worker.start() : 쓰레드를 실행한다.
  • app.exec_() : 무한루프. 프로그램을 강제종료해야 끝난다. 

실행결과

Woker 0 생성
Woker 1 생성
data = 1Woker 2 생성
Worker 0 소멸

data = 2
Worker 1 소멸
Woker 3 생성
data = 3
Worker 2 소멸
Woker 4 생성
data = 4
Worker 3 소멸
Woker 5 생성
data = 5Woker 6 생성


...


data = 97
Worker 96 소멸
Woker 98 생성
data = 98
Worker 97 소멸
Woker 99 생성
data = 99
Worker 98 소멸
data = 100
Worker 99 소멸
  • 모두 백개의 쓰레드가 생성된 후 
  • 각자, 공유데이터 값을 1 증가시킨후 스스로 소멸한다.
  • 최종적으로 data = 100이 되었다.

 

반응형

댓글