내가 보려고 만든 블로그

Asynchronous 에 대한 간단한 정리 본문

Python | Web/웹개발

Asynchronous 에 대한 간단한 정리

정의김 2023. 3. 24. 10:39

웹개발자가 아닌 나지만 하도 많이 들어본게 바로 Async 비동기 처리. 헷갈렸던 것들을 좀 적어보고 몇가지 개념들 정리해둠.

Non Blocknig , Async

우선 non blocking 과 Async , 거의 같은 개념처럼 느껴지는데 솔직히 매우 유사하긴 하다.

Async는 프로그래밍의 방식이라고 생각하면된다. Synchronous하게 프로그래밍했다면 return값을 기다리는 방식이고 Async라고 하면 return 을 신경쓰지 않고 다음에 처리할수 있는 것을 처리하러 가게 프로그래밍하는 것.

blocking은 반대로 방식이라기 보다는 실제로 물리적으로 일어나는 개념이라고 생각하면된다. io가 실제로 일어나냐 마느냐.

 

Coroutine

비동기 처리가 가능한 함수를 파이썬에서 coroutine이라고함 , async def 와 같은 함수들. 

 

Event loop , Await

coroutine객체는 event loop를 통해 관리가 된다고 한다. 정확히는 queue는 아니지만 queue처럼 들어온 coroutine객체를 차례차례 처리해줌 . 

Await는 다른 coroutine함수를 호출하는 함수임. coroutine객체를 호출하는 동안 호출한 해당함수는 멈추게 되고 다시 event loop의 관리에 들어가게 된다 . 

 

예제) Fastapi , aioredis

비동기 처리를 지원하는 웹프레임워크인 Fastapi . 보통 비동기 처리를 쓰는 경우가 네트워크 io, 디스크 io 일텐데

예를 들어 redis를 쓴다고 할 때 비동기처리를 제대로 활용하기 위해선 그냥 redis 라이브러리가 아니라 aioredis와 같이 비동기처리가 지원되는 라이브러리를 써야된다고 한다. 간단한 코드 예제는 아래와 같음. 

라이브러리만 다르지 쓰는 방법은 거의 유사함

import aioredis
from fastapi import FastAPI

app = FastAPI()

@app.on_event("startup")
async def startup():
    
    redis_pool = await aioredis.create_redis_pool("redis://localhost")

    app.state.redis = redis_pool

@app.on_event("shutdown")
async def shutdown():
    redis_pool.close()
    await redis_pool.wait_closed()

@app.post("/save")
async def save_data(data: str):
    redis_conn = redis_pool

    await redis_conn.set("mykey", data)

    return {"message": "Data saved successfully"}

 

 

 

 

'Python | Web > 웹개발' 카테고리의 다른 글

<Web> html 태그 정리  (0) 2022.10.10