以下代码不执行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({})
答案 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
这样,我在同步函数中调用了异步函数。