C++에서는 Network Programming에서 Thread를 다루었다.
하지만 필요한 함수가 많아 복잡했고

Python에서는 Thread의 구현방법이 매우 간단해서 간단하게 기록하자~

순서

I. Thread
II. 구현방법
III. Threading 객체 및 사용정리

python 공식사이트 docs.python.org/3.8/library/threading.html#threading.RLock

I. Thread

스레드는 Network 프로그래밍에서 하나의 프로세스를 통해
여러 클라이언트와 접속하기 위한 프로그래밍이다.

즉, 하나의 프로세스 안에서 다양한 실행 함수를 병렬로 구성하기 위함이다.

우리가 main으로 실행하는 스레드 외에 추가적으로 별도의 흐름을 만드는 것이다.


II. 구현방법

threading 모듈이 필요하다.

상세 객체 및 함수들은 하단에 정리

<기본 구현>

1. import threading
2. Thread 함수 연결
3. start, stop으로 제어

import threading

class MainClass():

    def __init__(self):
        # Thread 객체 생성
        self.threadctl = threading.Thread(target=self.subthread(3))
        
        # target 함수의 스레드 실행
        self.threadctl.start()

    # target 함수 정의
    def subthread(self, num):
        print("Thread function num : ", num)


if (__name__ == "__main__"):
    mainclass = MainClass();

 

1. Thread로 타겟 함수를 정의하고
2. start()로 실행한다.

이 코드는 스레드를 단 1번 실행한다.


<함수 반복 구현>

하지만 thread를 독립적으로 구현하는 이유는 특정 시간마다
해당 스레드의 함수를 계속 반복해야 할 때가 많다.
(특정 횟수 반복이 아닌, 이벤트 대기동안)

import threading
import os


class MainClass():

    def __init__(self):
        #self.threadctl = threading.Thread(target=self.subthread(1))
        self.num=0;
        
        # Thread 대신에 Timer사용
        # interval(sec) 만큼 이후에 함수 실행함
        self.threadctl = threading.Timer(interval=2, function=self.subthread, args=(1,))

        self.threadctl.start()

    def subthread(self,task):
        if(self.num <5) :
            self.num=self.num+1
            print("thread end")
            
            # 함수 안에서 다시 정의 및 start()
            self.threadctl = threading.Timer(interval=2, function=self.subthread, args=(1,))
            self.threadctl.start()

if (__name__ == "__main__"):
    mainclass = MainClass();

1. threading.Thread 대신 Timer로 정의
2. 함수 안에서 다시 한번 정의 및 start()로 반복
3. 특정 event가 들어오면 정지 및 시작 signal로 구현

Timer를 사용하여 특정 주기로 반복할 수 있는 스레드를 만들었다.


III. Threading 객체 및 사용정리

1. Threading 객체
2. Threading.Thread 클래스 인자


1. Threading 객체

객체 설명
**Thread 단일 실행 쓰레드를 만든다.
**Timer 실행되기 전 interval 시간 만큼 대기
*Lock Mutex와 같은 Lock 객체
*Semaphore 지정된 개수만큼의 스레드만 허용하는 세마포어 객체
Rlock Lock의 데드 락 문제 해결
(
재 획득 시 release)
BoundedSemaphore 현재 값이 초기 설정 값을 넘지 못하게 하는 세마포어
Barrier 여러 스레드의 특정 시점을 동기화 하기 위함.
Condition 하나의 스레드가 다른 스레드의 신호 대기
Event Event를 이용한 스레드간 통신

 


2. Threading.Thread 클래스 인자

 

인자 설명
target 타겟 함수
name 스레드 이름
args Tuple로 인자 전달 (arg1, ) 혹은 (arg1, arg2, ...)
kwargs Dictionary로 인자 전달 {dic1,3} 등등
daemon True : 프로세스가 종료되면 스레드도 종료
False : 프로세스가 종료되도 스레드 실행 중

 

 

+ Recent posts