타임트리

[Python] 바운드와 블로킹 본문

Today I Learned/동시성 프로그래밍

[Python] 바운드와 블로킹

sean_j 2024. 5. 26. 20:40

바운드

CPU 바운드

프로그램이 실행될 때, 실행 속도가 CPU 속도에 의해 제한되는 것을 CPU 바운드라고 한다. 즉, 프로그램이 실행될 때 I/O wating보다 CPU의 계산 시간이 길어 프로그램이 잠시 멈추게 되는 것을 의미한다. 아주 복잡한 수학 수식을 계산하는 경우 컴퓨터 실행속도가 느려지게 되는 현상을 말한다. 알고리즘을 공부할 때 마주치는 시간복잡도를 생각해보면 이해하기 쉽다.
예를 들어, 아래와 같이 1부터 100까지 for문이 3번 중첩된 아래 코드를 실행한다고 해보자.

def cpu_bound(num: int):
    total = 1
    arrange = range(1, num+1)
    for i in arrange:
        for j in arrange:
            for k in arrange:
                total *= i*j*k
    return total

if __name__=="__main__":
    result = cpu_bound(100)
    print(result)

위 파이썬 파일을 실행해보면, 연산 결과인 result가 출력되기까지 오랜 시간이 걸린다. 즉, 이처럼 cpu가 연산을 하기 때문에 프로그램 실행에 bound가 걸리는 것을 CPU 바운드라고 한다.

I/O 바운드

앞서 cpu 바운드가 cpu 연산에 의해 프로그램 실행이 막히는 것을 의미한다면, I/O 바운드는 Input과 Ouput에 의해 막히는 것을 의미한다.
즉, 프로그램이 실행될 때 실행 속도가 I/O에 의해 제한되는 것을 의미하는데, 아래 코드를 보자.

def io_bound():
    print("값을 입력하세요.")
    input_value = input()
    return int(input_value) + 100


if __name__=="__main__":
    result = io_bound()
    print(result)

위 코드를 실행해보면, "값을 입력주세요."를 출력하고 사용자 input이 들어올 때까지 프로그램은 멈춰있다. 이때, 프로그램은 CPU의 연산때문에 멈춘 것이 아니고 사용자가 아직 입력을 하지 않아 멈춘 것이다. 즉, 프로그램은 사용자에게 요청을 했고 응답하기를 기다리는 상태다.

위 예시는 사용자가 키보드로 입력하는 경우이지만, 컴퓨터끼리 통신할 때도 I/O 바운드가 발생한다. 이러한 경우를 네트워크 I/O 바운드라고 하는데 브라우저를 생각해보면 이해하기 쉽다.

예를 들어, 크롬 브라우저에서 F12를 눌러 개발자도구 - Network 탭을 켜놓고 새로고침을 해보자. 이 경우 구글 서버에 요청을 보내고 응답까지의 시간을 확인해보자(확인하기 쉽게 Slow 3G로 설정하자). 그러면 응답까지 약 3.19초가 걸렸는데 이 말은 3.19초의 I/O 바운드가 생겨 브라우저 프로그램이 멈춰있었다고 볼 수 있다.

이번에는 직접 코드로 확인해보자. requests 모듈을 사용해 url에 요청을 보내고 응답을 받기까지 걸리는 시간을 아래와 같이 확인해보면, 약 0.4초 정도 걸리는 것을 볼 수 있다. 즉, I/O 바운드가 걸려 0.4초 정도 바운드되었다.

import time
import requests

def io_bound(url):
    result = requests.get(url)
    return result


if __name__=="__main__":
    url = "https://google.com"
    start = time.time()
    result = io_bound(url)
    end = time.time()
    print(result)
    print("총 소요시간: {:.3f}초".format(end-start))
<Response [200]>
총 소요시간: 0.417초

블로킹

블로킹은 바운드에 의해 코드가 멈추는 현상을 의미한다. 만약 I/O 바운드를 확인하는 코드에서 요청을 10번 보낸다면 I/O 바운드에 의해 10번 블로킹이 일어났다고 표현한다.

 

 

---

참고: 인프런(파이썬 동시성 프로그래밍 : 데이터 수집부터 웹 개발까지 (feat. FastAPI))