[Django] 파이썬 장고 비동기 함수_ asyncio 활용하기
[Django] python django 비동기 함수_ asyncio 활용하기
SynchronousOnlyOperation: You cannot call this from an async context - use a thread or sync_to_async.
파이썬 장고에서 개발을 하면서, Celery가 아닌 간단한 비동기 함수가 필요할 때가 있다.
장고에서는 asyncio를 통해 비동기 함수를 구현할 수 있다.
Python 3.7 이상
■ 활용방법
import asyncio
async def sync_function(a, b, c):
test = str(a) + str(b) + str(c)
return 'success'
def str_add(request):
asyncio.run(sync_function('안녕', '나는', '장고'))
# 비동기로 선언한 함수를 실행할 때
###############################
return 'success'
'async def 함수명' 으로 선언 후 asyncio.run(async def 함수명()) 으로 호출하면 된다.
파이썬 3.7버전 미만 버전들은 루프 생성을 해줘야하지만
3.7 버전 이상은 단순히 run()으로 이벤트 루프를 만들고 코루틴을 실행하기 때문에 루프 생성이 필요 없습니다.
■ 비동기 함수에서 ORM 활용하기
import asyncio
async def sync_function(a, b, c):
test = str(a) + str(b) + str(c)
query_orm = StudentModel.objects.filter(id=1).first()
query_orm.name = 'test'
query_orm.save()
return 'success'
def str_add(request):
asyncio.run(sync_function('안녕', '나는', '장고'))
# 비동기로 선언한 함수를 실행할 때
return 'success'
# 비동기 함수에서 ORM을 활용하면 하기와 같은 에러가 발생한다.
SynchronousOnlyOperation: You cannot call this from an async context - use a thread or sync_to_async.
# 비동기 함수 ORM 에러 해결방안
해당 에러는 settings.py에서 간단한 설정으로 해결할 수 있다.
os.environ["DJANGO_ALLOW_ASYNC_UNSAFE"] = 'true'
또는 Celery로 처리하는 방향으로 가면 될 것 같다.
댓글