如何在 Django 中调用异步函数?
How to call asynchronous function in Django?
以下不执行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({})
您不能在此上下文中等待 foo。看Django主要是一个synchronous库,和异步代码交互不好。我能给它的最好建议是尽量避免在这里使用异步函数,或者使用另一种并发方法(即线程或多处理)。
注意:关于 Django 的同步特性的一个很好的答案可以在这里找到:.
找到方法了。
在与 urls.py
.
相同的目录中创建另一个文件 bar.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({})
Django 是一种同步语言,但它支持异步行为。
分享可能有帮助的代码片段。
import asyncio
from channels.db import database_sync_to_async
def get_details(tag):
response = another_sync_function()
# Creating another thread to execute function
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
async_result = loop.run_until_complete(remove_tags(response, tag))
loop.close()
# Async function
async def remove_tags(response, tag_id):
// do something here
# calling another function only for executing database queries
await tag_query(response, tag_id)
@database_sync_to_async
def tag_query(response, tag_id):
Mymodel.objects.get(all_tag_id=tag_id).delete()
这样我在同步函数中调用了异步函数。
以下不执行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({})
您不能在此上下文中等待 foo。看Django主要是一个synchronous库,和异步代码交互不好。我能给它的最好建议是尽量避免在这里使用异步函数,或者使用另一种并发方法(即线程或多处理)。
注意:关于 Django 的同步特性的一个很好的答案可以在这里找到:
找到方法了。
在与 urls.py
.
bar.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({})
Django 是一种同步语言,但它支持异步行为。 分享可能有帮助的代码片段。
import asyncio
from channels.db import database_sync_to_async
def get_details(tag):
response = another_sync_function()
# Creating another thread to execute function
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
async_result = loop.run_until_complete(remove_tags(response, tag))
loop.close()
# Async function
async def remove_tags(response, tag_id):
// do something here
# calling another function only for executing database queries
await tag_query(response, tag_id)
@database_sync_to_async
def tag_query(response, tag_id):
Mymodel.objects.get(all_tag_id=tag_id).delete()
这样我在同步函数中调用了异步函数。