본문 바로가기

코딩, 엑셀

파이썬 > 멀티쓰레드로 분산DB 접속하기


데이터 양이 엄청많으면 데이터베이스를 여러대로 분산해서 관리하게 되는데, 이럴 때 각 분산DB로 부터 반복적으로 쿼리로 조회해서 데이터를 수집해야할 일이 자주 생긴다. 이럴때 만약 DB가 총 20대라면, 순차적으로 쿼리를 날리게 되면 1분씩만 걸려도 총 20분이 소요되어야 하나의 쿼리를 날리게 된다. 그런데 멀티쓰레드로 작동하게 된다면 가장 오래 걸리는 DB한대의 쿼리 시간이면 모든 작업을 수행할 수 있게 되어서 엄청나게 작업시간을 단축시킬수 있다. 파이썬으로 멀티쓰레드 작동하는 방법을 알아보자. 

 

def util_query_to_all_dist_multithread(sql):

    threads = []
    rows = []

    start = datetime.now()

    for i in range(1, LAST_SERVER_NUM+1):
        server_num = str(i)
        if (i < 10): server_num = "0" + server_num

        dist_conn = pymysql.connect(host='?',
                                        user='?',
                                        password='?',
                                        db='?',
                                        charset='?')

        rows.append([])
        t = threading.Thread(target=fetchall_from_sql__multithread, args=(dist_conn, sql, rows[len(rows)-1]))
        threads.append(t)

    # 쓰레드를 모두 시작시킨다
    for i in threads:
        i.start()

    # 쓰레드가 모두 종료될 때 까지 기다린다
    for i in threads:
        i.join()

    print("쓰레드가 모두 종료되었다 ")

    # 분산DB들로부터 결과들을 모아서 하나로 만든다
    ret_rows = []
    for i in rows:
        ret_rows += i

    end = datetime.now()

    print("==========================================================")
    print("util_query_to_all_dist_multithread 수행 시간", end-start, len(ret_rows))
    print("==========================================================")

    return ret_rows

threading.Thread 함수로 쓰레드로 만들고 start() 함수로 실행하고 join() 함수로 모든 쓰레드가 수행을 마무리 할때까지 기다렸다가 모아온 데이터를 하나의 리스트로 모으는 과정이다. 즉, 20대의 쓰레드로 동시에 일을 시키고 각각 DB로 부터 수집해온 데이터를 하나의 큰 리스트로 모은다고 생각하면 쉽다. 

 

참고한 샘플 코드 문서

 

http://pythonstudy.xyz/python/article/24-%EC%93%B0%EB%A0%88%EB%93%9C-Thread

 

예제로 배우는 파이썬 프로그래밍 - 쓰레드 (Thread)

쓰레드 (Thread) 파이썬 프로그램은 기본적으로 하나의 쓰레드(Single Thread)에서 실행된다. 즉, 하나의 메인 쓰레드가 파이썬 코드를 순차적으로 실행한다. 코드를 병렬로 실행하기 위해서는 별도의 쓰레드(Subthread)를 생성해야 하는데, 파이썬에서 쓰레드를 생성하기 위해서는 threading 모듈 (High 레벨) 혹은 thread 모듈 (Low 레벨)을 사용할 수 있다. 일반적으로 쓰레드 처리를 위해서는 thread 모듈 위에서 구현된

pythonstudy.xyz

https://stackoverflow.com/questions/11968689/python-multithreading-wait-till-all-threads-finished

 

python multithreading wait till all threads finished

This may have been asked in a similar context but I was unable to find an answer after about 20 minutes of searching, so I will ask. I have written a Python script (lets say: scriptA.py) and a scr...

stackoverflow.com

 


Only I can change me life, no one can do it for me. – Carol Burnett