Django 调用 async 异步方法

因需求需在 Django 内部使用异步方法并正常调用,官方已支持异步。介绍了异步适配函数 async_to_sync() 和 sync_to_async(),用于调用风格转换并保持兼容性。还说明了使用异步和同步函数的情况,以及 sync_to_async() 的两种线程模式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

由于某些需求,需要在django内部使用异步方法,并正常的调用。恰好,官方已经支持异步

官方文档参考:异步支持 | Django 文档 | Django

本次仅使用 异步适配函数 

当从异步的上下文中调用同步的代码时,有必要适配调用风格,反之亦然。为此,有两个适配器功能,可从 asgiref.sync 模块中获取:async_to_sync() 和 sync_to_async() 。它们用于调用样式之间转换,同时保持兼容性。

这些适配函数广泛应用于 Django。asgiref 包本身就是 Django 项目的部分,并且它在当你用 pip 方式安装 Django 时,会作为依赖项目自动安装。

 async_to_sync()

 使用异步函数并返回包装它的同步函数。可用作直接包装器或装饰器:

from asgiref.sync import async_to_sync

async def get_data(...):
    ...

sync_get_data = async_to_sync(get_data)
from asgiref.sync import async_to_sync

@async_to_sync
async def get_other_data(...):
    ...

如果存在异步函数,那么它会在当前线程的事件循环中运行。如果没有当前事件循环,则会为单独异步调用专门启动一个新的事件循环,并且会在它完成后再次关闭。无论哪种情况,异步函数会在调用代码的不同线程上执行。

sync_to_async()

使用同步函数并返回包装它的异步函数。可用作直接包装器或装饰器: 

from asgiref.sync import sync_to_async

async_function = sync_to_async(sync_function, thread_sensitive=False)
async_function = sync_to_async(sensitive_sync_function, thread_sensitive=True)

@sync_to_async
def sync_function(...):
    ...

Threadlocals 和 contextvars 值在两个方向的边界上都保持不变。

假设所有同步功能都在主线程中运行时,则倾向于编写同步功能,因此 sync_to_async() 有两个线程模式:

  • thread_sensitive=True (默认使用):同步函数将与所有其它 thread_sensitive 函数在相同线程里运行。如果主线程是同步的并且你正在使用 async_to_sync() 装饰器,则该同步函数将成为主线程。
  • thread_sensitive=False:同步函数将在一个全新的线程中运行,该线程一旦完成,将会关闭。
### Django 异步操作数据库的方法 Django Async ORM 是一种为 Django 提供异步支持的技术方案,其核心理念是通过在现有同步方法的基础上增加 `async_` 前缀来实现异步化[^2]。这种方法覆盖了从简单查询到复杂事务的各种场景,例如批量创建、更新以及删除等操作。 #### 使用异步方法的操作方式 为了执行异步数据库操作,可以调用带有 `async_` 前缀的函数。以下是几个常见的例子: 1. **异步获取对象** 如果需要以异步方式检索某个特定的对象,可以通过如下代码完成: ```python import asyncio from myapp.models import MyModel from django_async_orm.async_orm import async_get async def get_object(): obj = await async_get(MyModel, id=1) return obj ``` 2. **异步过滤查询集** 对于复杂的筛选条件,也可以使用异步版本的 `.filter()` 方法: ```python from django_async_orm.async_orm import async_filter async def filter_objects(): queryset = await async_filter(MyModel.objects.all(), condition=True) return queryset ``` 3. **异步保存实例** 当需要保存一个模型实例时,可以利用 `async_save` 方法替代传统的 `.save()` 方法: ```python from django_async_orm.async_orm import async_save async def save_instance(instance): await async_save(instance) ``` 4. **异步批量创建记录** 批量插入多条数据同样可以通过异步方式进行优化: ```python from django_async_orm.async_orm import async_bulk_create async def bulk_create_records(records): await async_bulk_create(MyModel, records) ``` 以上示例展示了如何基于 `django-async-orm` 实现基本的异步数据库交互功能[^1]。 #### 配置与集成 要启用该功能,需先安装并配置好 `django-async-orm` 插件。按照官方文档指引设置完成后,在项目中引入相应的模块即可开始编写异步逻辑[^3]。 需要注意的是,尽管此插件极大提升了性能表现,但在实际部署前仍建议充分测试兼容性和稳定性问题[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值