[Python] Concurrency 어떤 경우에 어떤 것을 사용하는게 좋을까 - 1
·
Python/Python
어느 상황에 어떤 Concurrency API를 사용하는게 좋을까 우리는 평소 개발 업무를 하면서 최대한 Response latency, Memory Usage 등을 줄이기 위해 노력을 한다. 예를 들어, ORM을 사용하는 경우 N+1 이나 1+N+a 등 Query Fetch를 줄이거나 또는, Algorithm을 이용해 시간복잡도를 최대한 적게 할려고 하는 등 말이다. 그럼 Python에서 비동기 소스를 개발할 때는 어떠한 경우에 어떻게 해야 좋은지 알아보자. 우선 Python이 제공하는 concurrency API는 다음과 같다. Coroutine: asyncio module Thread: threading module Process: multiprocessing module 이 3가지의 module ..
[Python] Thread와 Async를 이용한 비동기 방법
·
Python/Python
Python Thread와 Async를 이용한 비동기 방법 이후 Client에서 Request 보낼 Server의 소스는 다음과 같다. @router.get("/second") async def second(): return { "second": random.randint(1, 100), } 그리고 일반 함수를 생성해서 Server로 Request 했을 때, 약 20초 걸린다. import datetime import requests def second_request(): resp = requests.get("http://localhost:8090/second") start = datetime.datetime.now() for _ in range(0, 10): second_request() print(d..
[Python] 파이썬 비동기 I/O
·
Python/Python
비동기 I/O 개발 업무를 하면서 실제 코드 자체보다는 코드에 필요한 데이터를 얻어오는 작업이 병목이 생기는 것을 많이 겪었을 것이다. 이런경우 프로그램 I/O 위주라 하고 I/O 효율이 속도를 제한 한다는 것을 의미한다. I/O는 프로그램 흐름에 큰 영향을 미친다. 파일이나 네트워크 소켓 연결을 통해 데이터를 읽을 때까지 실행을 멈추고 커널에 연산을 요청한 후 끝날때 까지 기다려야 하기 때문이다. 비동기 I/O를 활용하면 I/O 연산을 기다리는 동안 다른 연산을 수행하여 유휴 시간을 활용할 수 있다. 작업1,2,3 을 순차적으로 실행한다면 지연을 세번 감수해야 하지만 세 작업을 동시에 실행한다면 시간을 감소할 수 있을 것이다. 파이썬에서는 제너레이터 기반의 Coroutine과 async 함수로 Nati..