[Python] 병렬성과 동시성

변도진·2025년 10월 15일

Python

목록 보기
16/16

병렬성과 동시성

  • 병렬성 : 여러 노동자가 동시에 작업
  • 동시성 : 여러 작업이 동시에 진행

Python의 비동기

특징/종류asyncmultithreadmultiprocess
동시성XOO
병렬성XXX

asyncio

이는 await때 제어권을 넘겨줄 뿐 동시적 실행을 보장하지 않는다.

multithread

thread를 만들어 여러 thread를 번갈아가며 task를 수행한다. 그러나 단일 코어에서 동작함으로 병렬적으로 실행되지 않는다. (그러나 GIL을 해제하면 병렬 처리가 가능하다. 참고)

multiprocess

process를 여러개 돌린다. 병렬성 동시성 모두 보장한다.

예시

import threading
import asyncio
import multiprocessing
import time

# 공통 작업: CPU-bound (무거운 연산)
def task_cpu(name):
    print(f"task {name} : start")
    total = sum(i * i for i in range(5_000_000))  # 약간 무거움
    print(f"task {name} : end")

# asyncio용 async 함수
async def task_async(name):
    print(f"task {name} : start")
    total = sum(i * i for i in range(5_000_000))  # await 없음 → 동시성 없음
    print(f"task {name} : end")

# threading 실행
def run_threading():
    print("===================================")
    print("▶ threading (CPU-bound)")
    start = time.time()

    threads = []
    for i in range(1, 6):
        t = threading.Thread(target=task_cpu, args=(f"threading[{i}]",))
        t.start()
        threads.append(t)
    for t in threads:
        t.join()

    print(f"⏱️ Time: {time.time() - start:.2f} seconds")
    print("===================================\n")

# asyncio 실행
def run_asyncio():
    print("===================================")
    print("▶ asyncio (CPU-bound)")
    start = time.time()

    async def main():
        await asyncio.gather(*(
            task_async(f"asyncio[{i}]") for i in range(1, 6)
        ))

    asyncio.run(main())
    print(f"⏱️ Time: {time.time() - start:.2f} seconds")
    print("===================================\n")

# multiprocessing 실행
def run_multiprocessing():
    print("===================================")
    print("▶ multiprocessing (CPU-bound)")
    start = time.time()

    processes = []
    for i in range(1, 6):
        p = multiprocessing.Process(target=task_cpu, args=(f"multiprocessing[{i}]",))
        p.start()
        processes.append(p)
    for p in processes:
        p.join()

    print(f"⏱️ Time: {time.time() - start:.2f} seconds")
    print("===================================\n")

# 실행
if __name__ == "__main__":
    run_threading()
    run_asyncio()
    run_multiprocessing()
===================================
▶ threading (CPU-bound)
task threading[1] : start
task threading[2] : start
task threading[3] : start
task threading[4] : start
task threading[5] : start
task threading[3] : end
task threading[1] : end
task threading[2] : end
task threading[4] : end
task threading[5] : end
⏱️ Time: 1.11 seconds
===================================
===================================
▶ asyncio (CPU-bound)
task asyncio[1] : start
task asyncio[1] : end
task asyncio[2] : start
task asyncio[2] : end
task asyncio[3] : start
task asyncio[3] : end
task asyncio[4] : start
task asyncio[4] : end
task asyncio[5] : start
task asyncio[5] : end
⏱️ Time: 1.11 seconds
===================================
===================================
▶ multiprocessing (CPU-bound)
task multiprocessing[1] : start
task multiprocessing[2] : start
task multiprocessing[3] : start
task multiprocessing[4] : start
task multiprocessing[5] : start
task multiprocessing[2] : end
task multiprocessing[1] : end
task multiprocessing[3] : end
task multiprocessing[4] : end
task multiprocessing[5] : end
⏱️ Time: 0.41 seconds
===================================
profile
낚시하고 싶다.

0개의 댓글