同步和异步的核心区别
同步干完一件之后才能再干下一件事。遇到程序需要等待时程序卡死不动异步当遇到需要等待的事件 异步先去干其他的事件别的事情干完之后再后来干这个事件同步浪费CPU等待时间异步最大优化空闲时间如果用同步代码有人发起请求接口、查询数据库程序就卡死等待新来的请求全部排队 稍微多个请求就会卡顿、超时等问题异步的优势就是单线程就你能处理大量并发请求 不用频繁占用系统资源提升效率Tortoise-ORM集成ORM有以下特点效率高不用手动基础语句 复杂查询可以封装 不用手动拼接语句语法跟友好用python 就能操控数据库不用专门学习复杂的sql语句 对开发者等加友好Tortoise-ORM集成在做异步python 时候 使用ORM有时会卡死 整个程序运行不了 不符合异步开发的理念 而Tortoise-ORM刚好适合异步开发有以下特点原生异步:基于asyncio构建所有数据库操作都是异步的不会阻塞事件循环。Django风格的API:如果你用过Django ORM会发现语法非常熟悉上手极快。轻量级:专注于核心功能没有冗余的抽象层性能出色。完整的关系支持:支持外键、一对一、多对多等所有常见关系类型内置Pydantic 集成:可以通过 pydantic_model_creator 自动从 Tortoise 模型生成 Pydantic模型无缝对接FastAPI的请求/响应校验和传统同步ORM的区别Fastapi的用法getuser_router.get(/all) async def getAllUsers(): dataawait User.all() return {code:1,message:获取所有用户成功,data:data }user_router.get(/all) 括号里面可以自己定义变量名后面可以传值比如 id:int,name:ste 等user_router.get(/all/{id}/{name}) async def getAllUsers(id:int,name:str): dataawait User.all() return {code:1,message:获取所有用户成功,data:data }postuser_router.post(/save,summary保存用户) async def save_user(user: UserCreateRequest): user1await User.create( usernameuser.username, email user.email , phone user.phone, is_admin user.is_admin ) # await User.create(**dict(user)) return {code:1,message:保存用户成功,data:user1}如果是/{name}类型的 那么方法中传的数据变量名要与路径中的变量名相等url……/hello/1/ 路由就相等这个样子 path 可以为变量加约束 如class UserCreateRequest(BaseModel): username: strField( ..., min_length3, max_length50, description用户名, exampleadmin123 ) email: strField( ..., min_length5, max_length100, description邮箱, exampleadmintest.com ) phone: strField( None, min_length11, max_length11, description手机号, example13800138000 ) is_admin: boolField( False, description是否是管理员, exampleFalse )这是添加商品设置字段的的格式和校验下面就是添加的请求体 基本都是必填的 也可以为选填putuser_router.put(/update/{id},summary更新用户) async def update_user(id:int,user: UserCreate): user1 await User.get_or_none(idid) if not user1: return {code:0,message:用户不存在} # 1 # if user.username is not None: # user1.usernameuser.username # if user.email is not None: # user1.emailuser.email # if user.phone is not None: # user1.phoneuser.phone # if user.is_admin is not None: # user1.is_adminuser.is_admin # await user1.save() # 2 # 只把有值的字段变成字典排除掉未提供实际值的字段 # user_dictuser.dict(exclude_unsetTrue) # for key, value in user_dict.items(): # setattr(user1, key, value) # 使用 setattr() 方法动态设置属性 # await user1.save() # 3 user_dictuser.dict(exclude_unsetTrue) await User.filter(idid).update(**user_dict) return {code:1,message:修改成功,data:}修改内容有三个方法方法一user1 await User.get_or_none(idid) if not user1: return {code:0,message:用户不存在} # 1 # if user.username is not None: # user1.usernameuser.username # if user.email is not None: # user1.emailuser.email # if user.phone is not None: # user1.phoneuser.phone # if user.is_admin is not None: # user1.is_adminuser.is_admin # await user1.save() return {code:1,message:修改成功}方法不叫简单但是比较繁琐方法二user_router.put(/update/{id},summary更新用户) async def update_user(id:int,user: UserCreate): user1 await User.get_or_none(idid) if not user1: return {code:0,message:用户不存在} # 只把有值的字段变成字典排除掉未提供实际值的字段 user_dictuser.dict(exclude_unsetTrue) for key, value in user_dict.items(): setattr(user1, key, value) # 使用 setattr() 方法动态设置属性 await user1.save() return {code:1,message:修改成功}只把有值的字段变成字典排除掉未提供实际值的字段方法三user_router.put(/update/{id},summary更新用户) async def update_user(id:int,user: UserCreate): user_dictuser.dict(exclude_unsetTrue) await User.filter(idid).update(**user_dict) return {code:1,message:修改成功}这一块是要修改的内容deleteuser_router.delete(/delete/{id},summary删除用户) async def delete_user(id:int): # 1 # user1 await User.get_or_none(idid) # if user1 is None: # return {code:0,message:用户不存在} # await user1.delete() # 2 await User.filter(idid).delete() return {code:1,message:删除成功}在task中查找id 然后直接调用方法 delete就可以删除了 前面要加一个await挂载才可以使用

相关新闻

k8s-sidecar健康检查机制详解:如何配置Kubernetes就绪性与存活探针

k8s-sidecar健康检查机制详解:如何配置Kubernetes就绪性与存活探针

k8s-sidecar健康检查机制详解:如何配置Kubernetes就绪性与存活探针 【免费下载链接】k8s-sidecar This is a docker container intended to run inside a kubernetes cluster to collect config maps with a specified label and store the included files in a loc…

2026/7/20 18:09:15阅读更多 →
Kronos金融大模型:让AI读懂K线语言,5分钟开启智能投资决策

Kronos金融大模型:让AI读懂K线语言,5分钟开启智能投资决策

Kronos金融大模型:让AI读懂K线语言,5分钟开启智能投资决策 【免费下载链接】Kronos Kronos: A Foundation Model for the Language of Financial Markets 项目地址: https://gitcode.com/GitHub_Trending/kronos14/Kronos 在金融市场的波涛汹涌中…

2026/7/20 18:09:15阅读更多 →
保留旋律做风格改编的AI工具:6款AI音乐改编与Remix工具怎么选

保留旋律做风格改编的AI工具:6款AI音乐改编与Remix工具怎么选

改编和Remix最吸引人的地方,是熟悉的旋律能突然拥有另一种气质;最容易踩坑的地方,也恰恰是对现有音乐动手。先把底线说清楚:所有上传、解析、分轨、改词和曲风重制,都只应针对自己拥有完整权利,或已经取得明…

2026/7/20 18:09:15阅读更多 →
科研全流程效率革命:基于Codex与Skill理念的AI辅助工作流设计

科研全流程效率革命:基于Codex与Skill理念的AI辅助工作流设计

在科研工作中,你是否也经历过这样的困境:面对海量文献无从下手,论文写作逻辑混乱,数据图表绘制耗时费力,项目进度一团乱麻?传统的“单点式”工具和“帮我写论文”式的简单提问,已经无法应对日益…

2026/7/21 9:55:37阅读更多 →
WeChatExtension-ForMac完全指南:提升macOS微信效率的7个实用技巧

WeChatExtension-ForMac完全指南:提升macOS微信效率的7个实用技巧

WeChatExtension-ForMac完全指南:提升macOS微信效率的7个实用技巧 你是否遇到过微信消息撤回无法查看、多账号管理繁琐、聊天记录查找困难等问题?WeChatExtension-ForMac作为一款强大的Mac微信功能增强工具,通过插件形式为原生微信客户端带来…

2026/7/21 9:55:37阅读更多 →
SpringBoot+Vue3博客系统实战:从零搭建前后端分离项目

SpringBoot+Vue3博客系统实战:从零搭建前后端分离项目

如果你是一名Java开发者,或者正在寻找一个能写进简历、用于毕业设计的完整项目,那么“博客管理系统”大概率在你的候选清单里。但你可能也发现了,很多教程要么只讲后端,要么只讲前端,或者代码老旧、环境复杂&#xff0…

2026/7/21 9:55:37阅读更多 →
linux系统交叉编译

linux系统交叉编译

一、Linux系统创建文件1.vim 文件名;•VIM的三种模式(1)一般模式只能输入指令,不能输入文字;(2)编辑模式按i 就会进入编辑模式(插入模式),此时在状态列会有 I…

2026/7/21 9:55:37阅读更多 →
Hermes Agent多Profile并发运行实践与优化

Hermes Agent多Profile并发运行实践与优化

1. Hermes Agent多Profile并发运行实践作为一名长期使用Hermes Agent的开发者,最近我在本地机器上成功实现了三个独立Profile的并发运行。整个过程比预想的要简单许多,今天就把这套完整方案分享给大家。Hermes Agent作为当前最热门的AI Agent开发框架之一…

2026/7/21 9:55:37阅读更多 →
Unity 物理系统进阶:射线检测Raycast的基础用法

Unity 物理系统进阶:射线检测Raycast的基础用法

Unity 物理系统进阶:射线检测Raycast的基础用法📚 本章学习目标:深入理解射线检测Raycast的基础用法的核心概念与实践方法,掌握关键技术要点,了解实际应用场景与最佳实践。本文属于《Unity工程师成长之路教程》Unity 物…

2026/7/21 9:53:36阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/21 0:51:49阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/21 0:51:49阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/21 0:51:49阅读更多 →
Windows+macOS 通用 OpenClaw 部署流程,内置依赖一键启动智能桌面助手

Windows+macOS 通用 OpenClaw 部署流程,内置依赖一键启动智能桌面助手

📌教程适配:OpenClaw v2.7.9 | 兼容 Windows10/11、macOS 双系统 📖前言 当下各类本地 AI 工具层出不穷,多数产品仅能完成文字问答交互,很难直接操控电脑执行实际操作。OpenClaw,业内常称小龙虾 AI&#…

2026/7/21 0:01:46阅读更多 →
Codex 接入后 Bug 反增?复盘从个人演示到团队协作的“流程陷阱”

Codex 接入后 Bug 反增?复盘从个人演示到团队协作的“流程陷阱”

聊《一次Codex项目复盘,问题最后出在流程而不是模型》之前,先说一句实在的:别急着背概念,先看它在真实项目里到底解决什么问题。摘要先把这篇文章的目标说清楚:看完之后,你应该能判断这件事值不值得做&…

2026/7/21 0:01:46阅读更多 →
手把手搓一个五子棋游戏,零代码也能当“游戏开发者”

手把手搓一个五子棋游戏,零代码也能当“游戏开发者”

大家好,还是我。前几期带大家做了心情日记本和可视化大屏,后台有朋友留言:“能不能教点好玩的?我想做游戏,但一行代码都不会。”行,这期就安排。今天的目标:从零做一个五子棋游戏。 带AI对战、三…

2026/7/21 0:03:46阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/20 22:51:39阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/20 18:51:18阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/20 18:51:18阅读更多 →