| 특징/종류 | async | multithread | multiprocess |
|---|---|---|---|
| 동시성 | X | O | O |
| 병렬성 | X | X | X |
이는 await때 제어권을 넘겨줄 뿐 동시적 실행을 보장하지 않는다.
thread를 만들어 여러 thread를 번갈아가며 task를 수행한다. 그러나 단일 코어에서 동작함으로 병렬적으로 실행되지 않는다. (그러나 GIL을 해제하면 병렬 처리가 가능하다. 참고)
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 ===================================