Django Channels 异步调用ORM_django 异步orm-程序员宅基地

技术标签: python  django  

Database Access — Channels 3.0.4 documentation
https://channels.readthedocs.io/en/stable/topics/databases.html

数据库访问

Django ORM 是一段同步代码,因此如果您想从异步代码访问它,您需要进行特殊处理以确保其连接正确关闭。

如果您正在使用SyncConsumer,或任何基于它的东西——比如 JsonWebsocketConsumer——你不需要做任何特别的事情,因为你的所有代码都已经在同步模式下运行,Channels 将作为SyncConsumer代码的一部分为你做清理工作。

但是,如果您正在编写异步代码,则需要在安全的同步上下文中调用数据库方法,使用database_sync_to_async.

数据库连接

如果您使用线程消费者(同步消费者),通道可能会打开比您习惯的更多的数据库连接 - 每个线程最多可以打开一个连接。

如果您希望控制使用的最大线程数,请将ASGI_THREADS环境变量设置为 您希望允许的最大数量。默认情况下,Python 3.7 及以下版本的线程数设置为“CPU 数 * 5”,Python 3.8+ 版本设置为 min(32, os.cpu_count() + 4)。

为避免连接中有太多线程空闲,您可以改写代码以使用异步使用者,并且仅在需要使用 Django 的 ORM(使用database_sync_to_async)时才使用线程。

database_sync_to_async

channels.db.database_sync_to_async是一个asgiref.sync.sync_to_async 在退出时也会清理数据库连接的版本。

要使用它,请在单独的函数或方法中编写 ORM 查询,然后database_sync_to_async像这样调用它:

from channels.db import database_sync_to_async

async def connect(self):
    self.username = await database_sync_to_async(self.get_name)()

def get_name(self):
    return User.objects.all()[0].name

或者

from channels.db import database_sync_to_async

async def connect(self):
    self.username = await self.get_name()

@database_sync_to_async
def get_name(self):
    return User.objects.all()[0].name

传参:

class test:
    def checkDevice(self, deviceId):
        results = equipment.objects.filter(device_id=deviceId)
        return results
       
    def get(self,device_id):
    	results = await database_sync_to_async(self.checkDevice)(device_id)

如果直接使用的话会提示错误

results = await database_sync_to_async(
    equipment.objects.filter,
    thread_sensitive=True)(device_id=message["device_id"])
if (len(results) == 0):
    logger.info("Wrong check")

django.core.exceptions.SynchronousOnlyOperation: You cannot call this from an async context - use a thread or sync_to_async.
不能直接使用 results

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_43924621/article/details/119422382

智能推荐

基于SSM和MySQL的企业人事管理系统的设计与实现_基于ssm的企业人事管理系统的设计与实现参考文献-程序员宅基地

文章浏览阅读484次,点赞2次,收藏2次。管理员进入主界面,软件开始运行,提供用户登录功能,不同的用户登录操作的功 能不同,非管理员用户登录只能查看一些公告信息等,而管理员登录后,可以进行用户 管理丶部门管理、职位管理、员工管理、公告管理等功能。基于其他企业人事管理软件的不足,要求能够制作一个可以方便、快捷的对员工信 息进行添加、修改、删除的操作,为了能够更好的存储职工的信息,可以将职工的信息添 加到 Word 文档,这样,不但便于保存,还可以通过 Word 文档进行打印。员工信息的管理:维护员工的基本信息,用户可以进行员工档案信息的录入及更改,_基于ssm的企业人事管理系统的设计与实现参考文献

【C语言】手撕二叉树

【C语言】手撕二叉树

Postgresql源码(127)投影ExecProject的表达式执行分析

无论是投影还是别的计算,表达式执行的入口和计算逻辑都是统一的,这里已投影为分析表达式执行的流程。

hive启动beeline报错

出现上面的问题执行以下代码。

【Hadoop】-Hive客户端:HiveServer2 & Beeline 与DataGrip & DBeaver[14]

DataGrip是由JetBrains公司推出的数据库管理软件,DataGrip支持几乎所有主流的关系数据库产品,如DB2、Derby、MySQL、Oracle、SQL Server等,也支持几乎所有主流的大数据生态圈SQL软件,并且提供了简单易用的界面,开发者上手几乎不会遇到任何困难。3、连接成功,在里面我们可以看到我们前面章节所创建的表,这样子就可以在里面操作我们的sql语句的。5、连接成功,在里面我们可以看到我们前面章节所创建的表,这样子就可以在里面操作我们的sql语句的。

java lambda无法使用_java – 为什么不允许lambda函数?-程序员宅基地

文章浏览阅读1.2k次。我一直在Vaadin的GUI中工作,有一些来自我的IT主管的课程.这一切都很棒,但是,今天,我遇到过我不能在addListener方法类型中使用lambda表达式.此方法是自定义的,作为使用它的对象.这是实施:public class ResetButtonForTextField extends AbstractExtension {private final List listeners= n..._java: -source 1.5 中不支持 lambda 表达式

随便推点

wetrtc简介

wetrtc简介

单片机基于ST25DV动态标签的无线通信_st25dv能量采集-程序员宅基地

文章浏览阅读651次。利用I2C有线链路,任何NFC智能手机或NFC/RFID HF专业读卡器以及MCU均可以访问存储在这些标签中的数据,并且支持掉电保存。这些标签的集成度和性价比极高,可提供丰富的功能集,适用于各种应用。此外,开发人员可从评估板、软件工具、移动应用和其他资源构成的完整生态系统中受益,从而加快应用开发速度。在物联网产品的开发过程中,物联网设备非接触式向外界提供可变的交换信息非常有必要,比如路由器向手机提供可配置的WiFi信息,巡检点向手机提供动态的传感器数据等等。_st25dv能量采集

自己搭建 Linux 服务器踩坑记录_建立服务器踩过的坑-程序员宅基地

文章浏览阅读149次。前言妈蛋,自己搭建一个Linux服务器居然能遇到这么多坑。特此整理下,方便下次遇到同样的错误时能够回过头来快速定位问题并解决问题Number 1,服务器重启之后,Xshell 连接不上注:在服务器重启之前,我只安装了 jdk ,配置了 /etc/profile 环境变量,我一直以为是这个原因,后面把jdk 配置注释掉也没用正确的方向应该是先查看 ssh 服务有没有启动键入命令systemctl status sshd.service如果你的显示跟红框一样 【dead..._建立服务器踩过的坑

MT4606-VB_MOSFET产品应用与参数解析-程序员宅基地

文章浏览阅读187次。通过控制20Vgs (±V)的门源电压,可以实现开关管的导通和截止,实现对电流的控制和开关状态的转换。MT4606详细参数说明 - 极性 N+P沟道- 额定电压 ±30V- 额定电流 9A (N沟道), -6A (P沟道)- 导通电阻 15mΩ @ 10V (N沟道), 42mΩ @ 10V (P沟道), 19mΩ @ 4.5V (N沟道), 50mΩ @ 4.5V (P沟道)- 门源电压 20Vgs (±V)- 阈值电压 ±1.65Vth (V)- 封装类型 SOP8。_mt4606

达梦启云平台中,部署使用HIVE笔记_达梦sql中hiveing-程序员宅基地

文章浏览阅读637次。启云平台部署hive_达梦sql中hiveing

算法-前缀和与差分-程序员宅基地

文章浏览阅读606次,点赞27次,收藏14次。那么就可以把 preSum 的公式统一为,此时的 preSum[i] 表示 nums 中 iii 元素左边所有元素之和(不包含当前元素 iii)。​下面以 [1, 12, -5, -6, 50, 3] 为例,用动图讲解一下如何求 preSum。