프로그래밍/C, C++, Java, Python

[Python3] Multi-threading 및 thread 관리

포도알77 2019. 7. 4. 09:32

Python는 thread를 지원한다. C/C++과 Java처럼 함수 단위의 스레딩을 지원한다.

 

내 경우에는 기능을 완전히 분리하여 동작하기 때문에, Main thread와 별개로 특정 작업을 반복 수행한다. 더불어 각 스레드는 변수로 데이터를 공유하지 않고 DB를 이용한다.

# coding=utf-8
import sched
import threading

# 스케줄러 생성
readSchedule = sched.scheduler(time.time, time.sleep)
sendSchedule = sched.scheduler(time.time, time.sleep)

# 반복 처리 함수
def read():
    data = do_read()
    insert_data(data)
    readSchedule.enter(time.time()+60, 0, read)
    
def send():
    data = select_data()
    do_send(data)
    readSchedule.enter(time.time()+60, 0, send)

# 스레드 시작 함수
def read_thread():
    # Add read schedule
    readSchedule.enter(time.time()+5, 0, read)
    readSchedule.run()
    
def send_thread():
    # Add send schedule
    sendSchedule.enter(time.time()+5, 0, send)
    sendSchedule.run()

# 스레드 생성 함수
def makeThread(typeOfThread):
    thread = None
    if(typeOfThread == "read"):
        thread = threading.Thread(target=read_thread)
        thread.daemon = True
        thread.start()
    elif(typeOfThread == "send"):
        thread = threading.Thread(target=send_thread)
        thread.daemon = True
        thread.start()
    return thread

# 메인 스레드 동작
try :
    threads = {
        "read" : makeThread("read"), 
        "send" : makeThread("send")
    }
    
    while True:
        for tot in threads:
            if(not threads[tot].isAlive()):
                threads[tot] = makeThread(tot)
        time.sleep(5)
        
except Exception as e: 
	something_to_do()
    
finally :
	finally_to_do()

 

 코드는 아래와 같이 동작한다.

 (1) 스레드 생성 :  makeThread

(2) 스레드 시작 함수 동작 : read_thread / send_thread

(3) 스케줄러를 이용한 스레드별 동작 : read / send

 

 메인 스레드는 5초 간격으로 자식 스레드들이 잘 살아있는지 확인한 다음, 죽었으면 다시금 시작시킨다. 또한 thread에 daemon = True로 하여, 부모 스레드가 죽으면 (프로그램 종료시) 자식 스레드들이 모두 죽도록 처리하였다.

 

 마지막으로 scheduler.enter 함수는 (다음 실행 시간, 우선 순위, 함수)를 매개변수로 전달한다. 우선순위는 동일 시간에 여러개의 스케줄이 있을 때 우선순위가 높은(낮은 값) 것부터 실행한다.

 위 코드는 스레드 생성 후 5초 뒤에 첫 작업을 수행하고, 그 다음 작업부터는 60초 간격으로 반복한다.

페이스북으로 공유카카오톡으로 공유카카오스토리로 공유트위터로 공유URL 복사