如何在 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()

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

Reference for database sync to async decorator