본문 바로가기
파이썬 웹 개발

[Django] 파이썬 장고 비동기 함수_ asyncio 활용하기

by 배추잠자리 2022. 11. 2.
반응형

[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로 처리하는 방향으로 가면 될 것 같다.

 

반응형

댓글