코드로 우주평화

파이썬 멀티 스레딩 본문

나는 이렇게 학습한다/Language

파이썬 멀티 스레딩

daco2020 2022. 1. 16. 17:53
반응형

프로세스와 스레드 확인

os.getpid() : 현재 프로세스 아이디(PID)를 반환한다

threading.get_ident() : 현재 스레드의 식별자를 반환한다

 

print(f"{os.getpid()} process | {threading.get_ident()} url : {url}")

 

 

 

아래 실습 코드를 실행해보고 '싱글 스레드'와 '멀티 스레드'의 결과 값을 비교해보자

# 실습 코드

import requests
import time
import os
import threading
from concurrent.futures import ThreadPoolExecutor
'''
concurrent.futures 모듈은 비동기적으로 콜러블을 실행하는 고수준 인터페이스를 제공합니다.
비동기 실행은 (ThreadPoolExecutor를 사용해서) 스레드나 (ProcessPoolExecutor를 사용해서) 별도의 프로세스로 수행 할 수 있습니다.
'''

def fetcher(params):
    session = params[0]
    url = params[1]
    
    # 어떤 프로세스와 어떤 스레드가 사용되는지 확인
    print(f"{os.getpid()} process | {threading.get_ident()} url : {url}")

    with session.get(url) as response:
        return response.text

def main():
    urls = ["https://naver.com", "https://google.com"] * 5

    # max_workers=? 작업할 스레드의 수를 지정
    # 1개 지정시 1.9초
    # 10개 지정시 0.5초
    executor = ThreadPoolExecutor(max_workers=1)

    with requests.Session() as session:

        # 인수가 여러개이므로 리스트로 만든다
        params = [(session, url) for url in urls]

        # map 매서드, 함수와 인수를 넣는다
        # map은 재너레이터 객체이기 때문에 리스트로 바꿔준다
        list(executor.map(fetcher, params))

if __name__ == "__main__":
    start = time.time()
    main()
    end = time.time()
    print(end - start)

 

 

싱글 스레드의 결과 값

# ThreadPoolExecutor(max_workers=1) 의 경우
# 스레드 식별자가 모두 같은 것을 볼 수 있다 -> 싱글 스레드

69522 process | 13074235392 url : https://naver.com
69522 process | 13074235392 url : https://google.com
69522 process | 13074235392 url : https://naver.com
69522 process | 13074235392 url : https://google.com
69522 process | 13074235392 url : https://naver.com
69522 process | 13074235392 url : https://google.com
69522 process | 13074235392 url : https://naver.com
69522 process | 13074235392 url : https://google.com
69522 process | 13074235392 url : https://naver.com
69522 process | 13074235392 url : https://google.com
1.9546759128570557

 

 

멀티 스레드의 결과 값

# ThreadPoolExecutor(max_workers=10) 의 경우
# 스레드 식별자가 모두 다른 것을 볼 수 있다 -> 멀티 스레드

69503 process | 12953890816 url : https://naver.com
69503 process | 12970680320 url : https://google.com
69503 process | 12987469824 url : https://naver.com
69503 process | 13004259328 url : https://google.com
69503 process | 13021048832 url : https://naver.com
69503 process | 13037838336 url : https://google.com
69503 process | 13054627840 url : https://naver.com
69503 process | 13071417344 url : https://google.com
69503 process | 13088206848 url : https://naver.com
69503 process | 13104996352 url : https://google.com
0.5615730285644531

 

멀티 스레드가 동시성으로 작업을 수행하기 때문에 싱글 스레드보다 더 빠르게 작업을 수행한다

하지만 스레드를 만들고 우선순위를 부여하는 것도 모두 연산과정이며 메모리 점유율이 높아진다

'asyncio'를 사용해 코루틴으로 동작하는 코드가 스레드를 추가하는 것보다 더 효율이 좋다

 

 

 


 

레퍼런스

 

반응형