ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 데이터 추출과 삽질,,, 과정 기록 / python multi-threading
    Programming/Python 2023. 5. 1. 16:20
    반응형

     

    너무너무 무식한 과정들을 거쳐서 부끄럽지만,,그래도 기록

    멀티 프로세싱, 멀티 스레딩은 더 공부해보기


    1️⃣ 개요

    회사에서 진행 중인 프로젝트 과정 중에 성능시험을 위해 20만개 정도의 데이터를 추출해야 할 일이 생겼다.

    정확히 말하면 계정을 생성하고, 각 계정에 해당하는 토큰을 발급 받아 두어야 하는 과정이 있었다.

    계정 발급은 API를 통해서만 만들 수 있었기 때문에 계정을 발급하는 과정을 script를 이용해 만들어 두었었다.

    2️⃣ 첫 번째 시도

    맨 처음에는 정말 단순 무식하게 20만개를 차근차근 하나씩 돌렸다 ㅋㅋ…..

    스크립트 자체를 0 ~ 20만까지 for 문을 돌려서 만들려고 시도를 했다.

    정말 미친짓이었고 이렇게 돌리다가는 이틀 밤을 새도 다 안돌아갈 지경이었다.

    3️⃣ 두 번째 시도

    휴먼 멀티 프로세싱…을 했다…

    이게 어떤 말이냐면, 이런거다.

    일단 나는 스크립트를 하나를 만들어서 돌렸는데, 예를들면 create_account.py 이런 스크립트라고 하자.

    첫 시도에서는 저 스크립트 내부에 for문이 0~ 200,000까지 돌아 가고 있는 구조였다.

    근데 이걸 이제 index를 인자 값으로 받아서 서버 안에서 py스크립트를 20개를 나눠서 돌리기로 생각했다.

    예를들면 , nohup ./create_account.py & 이런 명령어를 20개를 돌리는거다.

    이 때 내가 직접..^_^ 한땀한땀 index를 넣어주면서 20개를 돌렸다.

    ps -ef | grep 명령어로 돌아가고 있는 py script를 서칭해보면 20개가 돌아가고 있었다.

    결론

    이 방법으로 하니 당연히 첫 번째 방법 보다는 시간이 많이 줄었다.

    당연히 20분의 1로는 줄었다 ㅋㅋ….

    근데 사람 손으로 index를 나눠서 돌리다보니 실수하기도 하고 , 정말 노가다 성이 강했다.

    4️⃣ 세 번째 시도

    드디어 멀티 스레딩이라는 것을 시도했다.

    https://docs.python.org/ko/3.7/library/concurrent.futures.html

    사실 핑계를 대자면 Python이 너무 익숙하지 않아 깊게 알아보지 않고 작업부터 시작했었다…

    그러다가 도저히 안되겠어서 멀티 스레딩 / 멀티 프로세싱 방법론에 대해 공부를 해보기 시작했다.

    사실 아직 완전히 이해한 것은 아니지만 우선 아주 간단히 문서를 읽고 thread pool을 이용해 작업을 진행했다.

    def multi_process():
        executor = ThreadPoolExecutor(max_workers=100)
        for i in range(0, 10):
            for j in range(0, 10):
                executor.submit(make_mode_account, i, j)
            
    

    → 이런 식으로 하나의 함수가 1000개의 계정을 만들도록 짜고, 그 함수를 100번 돌리는 멀티 스레딩을 구현했다.

    결론

    결과적으로 시간이 어어어엄청나게 단축 되었다. 반나절정도 걸리던 작업이 1시간도 안되어서 끝나는 기적을 보여줬다….

    5️⃣ 배운 점들

    I/O는 cost가 매우 크다.

    로그 확인을 위해 처음에는 거의 모든 진행 상황들을 print를 했었다.

    예를 들면 2324 index in proceed… 이런 식으로

    그런데 알고 보니 I/O는 cost가 매우 크고, 이런 식으로 모든 로그를 print하는 것은 정말 큰 비용 손해이다.

    멀티 프로세싱과 멀티 스레딩을 잘 구분해서 써야 한다.

    더 공부를 해보아야 할 내용이지만 멀티 프로세싱과 멀티 스레딩을 잘 구분해서 써야 한다.

    멀티 프로세싱의 경우 CPU가 멀티 코어가 아닌 경우 의미가 없을 수 있으며,

    멀티 스레딩의 경우 공유 자원에 대한 처리가 제대로 안되었을 경우 의미가 없을 수 있다.

    따라서 이런 저런 것들을 잘 고려해 가장 최적의 방법을 구현해야 한다.

    반응형

    댓글

Designed by Tistory.