주의: 아래 내용은 혼자만의 뇌내망상 이해이기 때문에 정확하지 않을 수 있음
async def 로 선언된 함수에서는 오래 걸리는 작업은 await 로 다른 프로세서에게 위임을 하고 제어권을 바로 돌려 주기때문에 다른 작업을 수행할 수가 있는데 데이터베이스 관련 모듈은 대부분 비동기를 지원하지 않는다.
그래서 데이터베이스 작업을 하는 함수에서 async def 를 사용하면 await 를 지원하지 않기 때문에 작업이 완료될 때까지 이벤트루프가 거기서 멈춰서 있어서 블럭킹이 발생한다.
fastapi 에서는 별도의 스레드풀을 만들어 놓고 def 함수들을 실행해주기 때문에 위와 같은 경우는 async def 보다는 일반 def 함수로 하는게 좋다.
아래는 그냥 비동기 실험
[code]
time.sleep(0.2)
print(f'{n}번째 함수 동기 작업완료’)
def main_func():
start = time.time()
sub_func(1)
sub_func(2)
sub_func(3)
end = time.time()
print(f’>>> 총 소요시간: {end – start}’)
async def sub_func_a(n):
for i in range(10):
print(f'{n}번째 비동기 함수: {i}’)
await asyncio.sleep(0.2)
print(f'{n}번째 비동기 함수 작업완료’)
async def main_func_a():
start = time.time()
sub_func(1)
await asyncio.wait([
asyncio.create_task(sub_func_a(1)),
asyncio.create_task(sub_func_a(2)),
asyncio.create_task(sub_func_a(3))
])
sub_func(2)
end = time.time()
print(f’>>> 총 소요시간: {end – start}’)
def main():
asyncio.run(main_func_a())
asyncio.run(main_func_a())
if __name__ == ‘__main__’:
asyncio.run(main_func_a())
print(‘끝’)
[/code]