如何在Django中调用异步函数?

时间:2020-06-15 14:25:30

标签: python django django-rest-framework python-3.6 django-3.0

以下代码不执行foo并给出 RuntimeWarning: coroutine 'foo' was never awaited

# urls.py

async def foo(data):
    // process data ...

@api_view(['POST'])
def endpoint(request):
    data = request.data.get('data')

    // How to call foo here?
    foo(data)

    return Response({})

3 个答案:

答案 0 :(得分:0)

在这种情况下,您不能等待foo。看到Django主要是一个 synchronous 库,它与异步代码的交互效果不佳。我可以提供的最佳建议就是尝试避免在此处使用异步函数,或者避免使用其他并发方法(即线程或多处理)。

注意:关于Django的同步特性,有一个很好的答案,可以在这里找到:Django is synchronous or asynchronous?

答案 1 :(得分:0)

找到了一种方法。

在与bar.py相同的目录中创建另一个文件urls.py

# bar.py

def foo(data):
    // process data
# urls.py

from multiprocessing import Process
from .bar import foo

@api_view(['POST'])
def endpoint(request):
    data = request.data.get('data')

    p = Process(target=foo, args=(data,))
    p.start()

    return Response({})

答案 2 :(得分:0)

Django是一种同步语言,但它支持异步行为。 共享代码段可能会有所帮助。

ul

这样,我在同步函数中调用了异步函数。

Reference for database sync to async decorator

相关问题