[파이썬] CPU-bound 작업과 I/O-bound 작업의 처리

CPU-bound 작업과 I/O-bound 작업은 프로그램에서 다른 유형의 작업을 처리하는 방식을 의미합니다. CPU-bound 작업은 CPU 연산에 많은 시간을 소비하고, I/O-bound 작업은 주로 데이터 입출력에 많은 시간을 소비합니다. 이러한 작업을 효율적으로 처리하기 위해 Python에서 제공하는 몇 가지 방법을 알아보겠습니다.

CPU-bound 작업

CPU-bound 작업은 주로 계산 작업을 의미합니다. 이러한 작업은 CPU 리소스를 많이 사용하므로, 단일 스레드로 처리한다면 실행 시간이 길어질 수 있습니다.

이러한 경우, Python의 multiprocessing 모듈을 사용하여 여러 개의 프로세스를 동시에 실행할 수 있습니다. 각 프로세스는 다른 CPU 코어에서 병렬로 실행되므로 계산 작업의 처리 속도를 향상시킬 수 있습니다.

import multiprocessing

def cpu_bound_task(number):
    result = number**2
    return result

if __name__ == '__main__':
    numbers = [1, 2, 3, 4, 5]
    pool = multiprocessing.Pool()
    results = pool.map(cpu_bound_task, numbers)
    pool.close()
    pool.join()
    
    print(results)

위의 예시에서는 cpu_bound_task()라는 함수를 사용하여 계산 작업을 수행합니다. multiprocessing.Pool()을 사용하여 여러 개의 프로세스를 생성하고, pool.map()을 사용하여 각 프로세스에 작업을 분배합니다. 마지막으로 결과를 출력하고 프로세스를 종료합니다.

I/O-bound 작업

I/O-bound 작업은 주로 파일 읽기/쓰기, 네트워크 통신, 데이터베이스 조회 등의 작업을 의미합니다. 이러한 작업은 I/O 리소스에 의존하므로, 단일 스레드로 처리한다면 I/O 작업 대기 시간이 발생하여 처리 속도가 저하될 수 있습니다.

이러한 경우, Python의 asyncio 모듈과 비동기 프로그래밍 기법을 사용하여 I/O 작업을 효율적으로 처리할 수 있습니다. 비동기 함수를 사용하면 I/O 작업을 기다리는 동안 다른 작업을 수행할 수 있으므로 전체 실행 시간을 단축시킬 수 있습니다.

import asyncio

async def io_bound_task(url):
    # I/O 작업 수행
    response = await fetch(url)
    return response

async def fetch(url):
    # 비동기 HTTP 요청 수행
    # ...

async def main():
    urls = ['https://example.com', 'https://google.com', 'https://facebook.com']
    tasks = [io_bound_task(url) for url in urls]
    
    results = await asyncio.gather(*tasks)
    
    print(results)

if __name__ == '__main__':
    asyncio.run(main())

위의 예시에서는 io_bound_task()라는 함수를 사용하여 I/O 작업을 수행합니다. 비동기 함수 내부에서 await 키워드를 사용하여 I/O 작업이 완료될 때까지 기다립니다. asyncio.gather()를 사용하여 여러 개의 비동기 작업을 실행하고 결과를 수집합니다. 마지막으로 결과를 출력합니다.

CPU-bound 작업과 I/O-bound 작업은 각각의 특성에 맞는 처리 방법이 있습니다. 이러한 방법을 잘 활용하여 프로그램의 성능을 향상시킬 수 있습니다.