데이터 양이 엄청많으면 데이터베이스를 여러대로 분산해서 관리하게 되는데, 이럴 때 각 분산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
https://stackoverflow.com/questions/11968689/python-multithreading-wait-till-all-threads-finished