상세 컨텐츠

본문 제목

[Python 스터디] Threading 활용하기

Python

by donggyu1998 2021. 11. 9. 00:17

본문

반응형

💡 Thread : 스레드란 ?

프로그램이 메모리에 올라가서 실행 중인 것을 프로세스(process)라고 부릅니다.

프로세스의 실행 단위를 스레드라고 합니다.

프로세스는 최소 하나 이상의 스레드를 갖으며 경우에 따라 여러 스레드를 가질 수도 있습니다.

 

데몬(daemon) 스레드는 메인 스레드가 종료될 때 자신의 실행 상태와 상관없이 종료되는 서브 스레드를 의미합니다.

앞서 threading 모듈을 사용해서 메인 스레드가 서브 스레드를 생성하는 경우 메인 스레드는 서브 스레드가 모두 종료될 때까지 기다렸다가 종료하게 됩니다.

 

그런데 실제 프로그래밍을 하다보면 경우에 따라 메인 스레드가 종료되면 모두 서브스레드가 동작 여부에 상관없이 종료되어야 하는 경우가 많습니다.

예를 들어 토렌토와 같은 파일 다운로드 프로그램에서 서브 스레드를 통해 파일을 동시에 다운로드 받고 있는데 사용자가 메인 프로그램을 종료하면 파일의 다운로드 완료 여부와 상관없이 프로그램이 종료되어야 할 것입니다.

이때 서브 스레드 들은 데몬 스레드로 만들어져야 합니다.

파이썬 threading 모듈에서 데몬 스레드의 생성은 daemon 속성을 True로 변경하면 됩니다.

💡 문제 

Python에서는 Thread와 Multiprocessing이 있습니다.

난이도 하 단계에서는 threading을 활용하여 자신만의 프로그램을 만드세요. 

 

조건 :

(1) Thread는 Python에서 현재 쓰지 않습니다. threading 사용하고 threading.Thread를 상속 받습니다.  

(2) main에서 만든 threading class 객체를 생성하여 출력합니다.

 

import threading
import time
import random

class ThreadingClass(threading.Thread):
    
    def __init__(self):
        
        threading.Thread.__init__(self)
            
        self.setDaemon(True)
        self._num_list = []

    def run(self):
        
        while True:
            time.sleep(0.5)
            num = random.randrange(1, 6)
            
            self._num_list.append(num)
            print (self._num_list)

 

setDaemon이 없는 경우 Thread는 무한 반복되기 때문에 Thread 작업 시 넣어주셔야 좋습니다.

 

class에 threading.Thread를 상속받은 후 실행하기 위해서는 start를 실행시키고 threading에서는 함수명을 run으로 해야합니다.

(threading 동작 내부 코드 참고)

A class that represents a thread of control.

This class can be safely subclassed in a limited fashion. There are two ways

to specify the activity: by passing a callable object to the constructor, or

by overriding the run() method in a subclass.

 

Thread 객체당 최대 한 번만 호출해야 합니다.

객체의 run() 메서드는 별도의 제어 스레드에서 호출됩니다.

이 메서드는 에서 두 번 이상 호출되면 RuntimeError를 발생시킵니다.

Start the thread's activity.

It must be called at most once per thread object. It arranges for the

object's run() method to be invoked in a separate thread of control.

This method will raise a RuntimeError if called more than once on the

same thread object.

 

0.5초마다 num_list에 랜덤 값을 추가합니다.

그 후 출력합니다.

 

from threadingclass import ThreadingClass

def main():
    
    thread = ThreadingClass()
    thread.start()
    
    
if __name__ == "__main__":
    main()

Thread 객체를 생성 후 실행합니다.

 

스레드의 start()는 활동을 시작합니다.

스레드 객체 당 최대 한 번 호출되어야 합니다.

객체의 run()메서드가 별도의 제어 스레드에서 호출되도록 배치합니다.

이 메서드는 같은 스레드 객체에서 두 번 이상 호출되면, RuntimeError를 발생시킵니다.

 

스레드의 run()은 활동을 표현하는 메서드.

서브 클래스에서 이 메서드를 재정의할 수 있습니다.

표준 start() 메서드는 target 인자로 객체의 생성자에 전달된 콜러블 객체를 호출합니다, 있다면 args와 kwargs 인자에서 각각 취한 위치와 키워드 인자로 호출합니다.

반응형

관련글 더보기