2. python协程/异步编程详解
目录
1. 简单的异步程序
2. 协程函数和协程对象
3. 事件循环
4. 任务对象Task及Future对象
4.1 Task与Future的关系
4.2 Future对象
4.3 全局对象和循环事件对象
5. await关键字
6. 异步上下文管理
7.异步迭代器
8. asyncio的常用函数
8.1 asyncio.run
8.2 asyncio.get_event_loop
8.3 asyncio.wait
8.4 asyncio.wait_for
8.5 asyncio.create_task和loop.create_task
8.6 eventloop.call_later
8.7 eventloop.close
协程(coroutine):类似一种轻量级的多线程程序,是在一个线程里面,实现多任务并行执行的编程方式。相比多线程,它在切换任务时,CPU开销更低,速度更快。
协程实现多任务并行执行实际是通过各任务异步执行来实现的。
asyncio 是python异步代码库,是几乎所有python异步实现的基础,因此,使用python的协程功能,得先掌握asyncio库的使用。
1. 简单的异步程序
import asyncio
async def fun1():print('a')await asyncio.sleep(.5)print('b')async def fun2():print('c')await asyncio.sleep(.5)print('d')asyncio.run(asyncio.wait([fun1(),fun2()]))
运行结果:
可以看到,虽然fun1和fun2是依次放进事件列表中的,可实际执行,并不是abcd,而是cadb,先执行fun2后执行fun1,这里与列表在函数取参时LIFO(后入先出)有关。
在执行过程中,fun2先打印c后,遇到sleep,并不是原地阻塞0.5秒,而是跳出来,执行fun1,打印a,在fun1中又遇到sleep,这里又跳出来执行fun2,fun2结束后又去fun1执行。这就是异步执行,它并不是顺序执行,而是可以暂停当前执行的流程,转到另一个程序中去执行,之后又回到暂停位置继续执行。
2. 协程函数和协程对象
由async声明定义的函数,即是协程函数,它直接返回的就是协程对象。
协程函数要被执行,须将协程对象交给事件循环来处理,或者通过await关键字执行,不能直接执行协程函数。
注意,协程函数直接返回协程对象,指函数名()返回,并不是执行结果return返回:
import asyncio
async def fun():await asyncio.sleep(.5)print("This is a coroutine function")return "Hello world"async def main():t = fun()r = await tprint(f"Result:{r}")asyncio.run(main())##运行结果:
This is a coroutine function
Result:Hello world
示例中函数名fun()返回的是一个协程对象,它被赋值给t,通过await执行后,fun最后的返回结果放在r中,fun的return返回Hello world,因此最后打印出的r就是Hello world
3. 事件循环
事件循环是asyncio运行的核心,是由循环调度器_event_loop_policy调度加入到Task队列中的Task对象进行执行。
在上面调用asyncio.run函数的时候,该函数实际是创建一个循环调度器,并将将可Task对象放进循环中,然后等待对象执行完成,再退出。它相当于:
eventloop = asyncio.new_event_loop()
asyncio.set_event_loop(eventloop)
eventloop.run_until_complete(obj)
asyncio.new_event_loop创建一个新的循环调度器,set_event_loop启用该调度器,run_until_complete将对象obj放入调度器的Tasks队列中,等待执行完成。
事件循环的本质是将所有待执行的协程对象包装成任务对象(Task对象),将Task对象放入到事件循环队列中,调度器执行事件循环,当某个对象遇到阻塞,就挂起转而执行队列中的其它对象,当挂起时间到了,又回到该对象挂起位置继续执行。
4. 任务对象Task及Future对象
4.1 Task与Future的关系
asyncio.Future类是一个基类,asyncio.Task类继承自Future。事件循环调度器中执行的对象就是任务对象(Task对象),只有Future对象(或Task对象)才能放入进事件循环队列tasks中。
因此,上面示例中,run_until_complete接收的参数应该是Future对象,当run_until_complete传入一个协程对象后,会先判断是否为Future对象,如果是协程,则被wrap成Task对象(Task(coro,eventloop)),再将对象注册(_register_task)到队列中。
4.2 Future对象
通常不直接用,它常用来保存最后结果,在Task对象中,当等待Future.result()时,也即任务结整返回,最后执行Future.set_result(value):
import asyncioasync def fun(fut:asyncio.Future):print("This is a coroutine")fut.set_result('ABCDE')async def main():eventloop = asyncio.get_event_loop()fut = eventloop.create_future()eventloop.create_task(fun(fut))r = await futprint(f'Result:{r}')asyncio.run(main())##运行结果:
This is a coroutine
Result:ABCDE
分析:asyncio.get_event_loop返回当前执行的EventLoop对象,它由asyncio.run创建。eventloop.create_future()创建一个Future对象,它什么也不做,它被当作参数传入到协程中;evenloop.create_task()将协程wrap成Task对象,加入到事件循环调度器的任务队列Tasks中,await fut等待fut有结果,并将结果保存在r中。
当协程执行完后,调用fut.set_result就会在Future对象中产生一个值(结果),这时协程返回,await fut就因为fut有结果了结束,将结果返回给r,即ABCD。
4.3 全局对象和循环事件对象
t1 = asyncio.create_task(coro)
t2 = eventloop.create_task(coro)
fut1 = asyncio.create_future()
fut2 = eventloop.create_future()
ayncio和eventloop都能创建Task对象,前者是个全局Task对象,不依赖特定的事件循环,而后者则依赖当前的eventloop事件循环
5. await关键字
await 后面跟可等待对象(awaitable,包括协程对象,任务对象,Future对象),这些对象最终都会被wrap成Task对象执行。await主要作用是暂停当前协程,等待对象执行完成,返回执行结果(函数最后的return),才回到当前协程。
import asyncioasync def fun1():print("This fun1")await asyncio.sleep(.5)print("Fun1 over")return "A fun return."
async def fun2():print("This fun2")await asyncio.sleep(.5)print("Fun2 over")
async def fun3():print("This fun3")await asyncio.sleep(.5)print("Fun3 over")async def main():eventloop = asyncio.get_event_loop()a = eventloop.create_task(fun1())b = asyncio.create_task(fun2())print(f'{await a}')await fun3()await basyncio.run(main())##运行结果:
This fun1
This fun2
Fun1 over
Fun2 over
A fun return.
This fun3
Fun3 over
示例分析:eventloop.create_task返回的是协程wrap后的Task对象,分别赋值给变量a和b,await可以作用Task对象,因此,await a得以执行,它等待a执行,直到a返回结果(字符串A fun return,通过print打印出来)。
从运行结果看,实际上await a返回时,fun2已经结束了,也就是b对象已经执行结束了,所以,await fun3执行结果并不会出现在a,b对象执行的过程中,后面的await b也不会出现执行结果,因为前面已经执行完了。
一个特别的函数:
await asyncio.sleep(n)
它表示暂停当前任务的事件循环控制权,转而执行其它异步任务,时间到了后,再回到当前协程继续执行。
6. 异步上下文管理
python中上下文管理关键字with,它可以自动创建资源,并在结束后自动回收资源。with作用于定义了__enter__和__exit__方法的对象。
__enter__():定义了进入with代码块执行的动作,返回值默认为None,也可以指定某个返回值,返回的接收者就是as后面的变量;
__exit__(exc_type, exc_value, traceback):定义了退出with代码块执行的动作
class Person:def __init__(self):self.name:str = "YSZ"self.score:float = 93.7def __enter__(self):print("Person enter")return selfdef __exit__(self, exc_type, exc_value, traceback):print("Person exit.")with Person() as p:print(f"name:{p.name}")print(f"score:{p.score}")##运行结果:
Person enter
name:YSZ
score:93.7
Person exit.
异步上下文管理器是在with前面增加async关键字的管理器,类似的,这里作用的对象是定义了__aenter__和__aexit__两个异步函数的对象:
import asyncioclass Person:def __init__(self):self.name:str = "YSZ"self.score:float = 93.7async def __aenter__(self):print("Person enter")return selfasync def __aexit__(self, exc_type, exc_value, traceback):print("Person exit.")async def main():async with Person() as p:print(f"name:{p.name}")print(f"score:{p.score}")asyncio.run(main())##运行结果
Person enter
name:YSZ
score:93.7
Person exit.
7.异步迭代器
一般情况下,可以用for in迭代遍历的对象都是定义了__iter__,__next__函数的对象,其中:
__iter__返回一个可迭代对象iterator
__next__返回操作对象,赋给for后面的变量(如下例的i),for不停的迭代,直到引发一个StopIteration异常:
class Person:def __init__(self):self.index = 0self.names:tuple = ("YSZ","TMS","JYN","MOD","GXT","QES")self.name:str = Nonedef __iter__(self):return selfdef __next__(self):self.name = self.names[self.index]self.index += 1if self.index > 5:raise StopIterationreturn selffor i in Person():print(f"name:{i.name} index:{i.index}")##运行结果:
name:YSZ index:1
name:TMS index:2
name:JYN index:3
name:MOD index:4
name:GXT index:5
类似的,异步迭代器的对象是定义了__aiter__和__anext__函数的对象,其中:
__aiter__函数不能是异步的,它返回一个异步可迭代对象asynchronous iterator,赋给in后面的变量
__anext__返回对象必须是可等待(awaitable)对象,因此它必须是一个协程函数。async for不停的迭代,直到引发一个StopAsyncIteration异常停止:
class Person:def __init__(self):self.index = 0self.names:tuple = ("YSZ","TMS","JYN","MOD","GXT","QES")self.name:str = Nonedef __aiter__(self):return selfasync def __anext__(self):self.name = self.names[self.index]self.index += 1if self.index > 5:raise StopAsyncIterationawait asyncio.sleep(.2)return self.nameasync def main():person = Person()async for i in person:print(f"name:{i}")asyncio.run(main())##运行结果:
name:YSZ
name:TMS
name:JYN
name:MOD
name:GXT
注意:async for只能在协程函数中使用
8. asyncio的常用函数
8.1 asyncio.run
在第3点已经说明了,它实际是创建了一个新的事件循环调度器,并启动这个调度器,然后等待传给它的对象执行完成,它的参数接收可等待对象(协程对象,Task对象,Future对象)
8.2 asyncio.get_event_loop
返回:事件循环调度器
它会获取当前正在运行的事件循环调度器,相当于asyncio.get_running_loop();
如果当前没有正在运行的事件循环,则创建一个新的事件循环,相当于loop = asyncio.new_event_loop,同时运行这个事件循环:asyncio.set_event_loop(loop),并将这个事件循环调度器返回。
8.3 asyncio.wait
参数:一组可等待对象列表(list)
返回:Future对象
作用:等待一组可等待对象完成,最后返回任务结束的结果
例如:asyncio.run(asyncio.wait(fun1(),fun2(),fun3()),其中fun1()~fun3()是协程对象
8.4 asyncio.wait_for
参数:可等待对象,超时的时间timeout
返回:可等待对象执行结束后的返回(return)
作用:通常和关键字await连用,表示对象必须在设定时间内执行完毕,否则抛出一个超时异常asyncio.TimeoutError
import asyncioasync def fun():print("Step1")await asyncio.sleep(.5)print("Step2")await asyncio.sleep(.5)return "Fun back"async def main():try:r = await asyncio.wait_for(fun(),timeout=0.8)print(f"Result:{r}")except asyncio.TimeoutError:print("Object execute timeout.")asyncio.run(main())##运行结果:
Step1
Step2
Object execute timeout.
示例中规定了0.8秒内要完成fun()对象,但是里面花了1.0秒,固而抛出超时异常
8.5 asyncio.create_task和loop.create_task
参数:协程对象
返回:Task对象
作用:创建一个Task对象,第4.3已经说明了它们的区别,其中loop.create_task同时将创建的对象注册到任务队列中了,事件循环会执行它,而asyncio.create_task则是创建一个全局对象,并没有加到某个事件循环的队列中,需要await执行
8.6 eventloop.call_later
参数:时间,回调函数,函数的参数
返回:TimerHandle
作用:布置一个任务,过了“时间”之后被执行
import asynciodef fun(name:str):print(f"name:{name} Hello world")async def main():eventloop = asyncio.get_event_loop()eventloop.call_later(1,fun,'YSZ')await asyncio.sleep(3)print("Over!")asyncio.run(main())##运行结果:
name:YSZ Hello world
Over!
示例中布置了一个任务,注意,并非是协程,而是普通函数,并要求在1秒后执行,需要await asyncio.sleep(3)等待,否则循环事件结束了,这个回调还没执行。
8.7 eventloop.close
作用:关闭事件循环,需要先检查事件循环是否正在运行eventloop.is_running(),如果正在运行,则关不了,会触发一个RuntimeError异常。
相关文章:
2. python协程/异步编程详解
目录 1. 简单的异步程序 2. 协程函数和协程对象 3. 事件循环 4. 任务对象Task及Future对象 4.1 Task与Future的关系 4.2 Future对象 4.3 全局对象和循环事件对象 5. await关键字 6. 异步上下文管理 7.异步迭代器 8. asyncio的常用函数 8.1 asyncio.run 8.2 asyncio.get…...
XSS靶场实战(工作wuwuwu)
knoxss knoxss Single Reflection Using QUERY of URL ——01 测试标签 <script>alert(666666)</script>——02: " <h1>test</h1>没有反应,查看源码 现在需要闭合双引号,我计划还是先搞标签 "><h1>tes…...
DNA复制过程3D动画教学工具
DNA复制过程3D动画教学工具 访问工具页面: DNA复制动画演示 工具介绍 我开发了一个交互式的DNA复制过程3D动画演示工具,用于分子生物学教学。这个工具直观展示了: DNA双螺旋结构的解旋过程碱基互补配对原理半保留复制机制完整的复制周期动画 主要特点…...
在Mybatis中写sql的常量应用
下面示例把原来写死的 1、2、3 都替换成了绑定好的常量,同时额外演示了如何把第五个状态也一起统计(如果你的 DTO 没有对应字段,也可删掉相应那一行)。 <!-- 1. 定义可复用的常量绑定 --> <sql id"DeviceStatusCon…...
一次讲明白SaaS、PaaS、IaaS、aPaaS、iPaaS、RaaS、RPAaaS
在数字化浪潮与5G技术的强势驱动下,各行业对云服务的需求正呈现出井喷式增长态势,众多企业纷纷投身云服务的怀抱,以期在激烈的市场竞争中抢占先机。而谷云科技作为iPaaS领域的佼佼者,也在这股浪潮中大放异彩,助力企业实…...
RTDETRv2 pytorch训练
RTDETRv2 pytorch训练 1. 代码获取2. 数据集制作3. 环境配置4. 代码修改1)configs/dataset/coco_detection.yml2) configs/src/data/coco_dataset.py3)configs/src/core/yaml_utils.py4)configs/rtdeterv2/include/optimizer.yml 5. 代码训练…...
Unity3D仿星露谷物语开发39之非基于网格的光标
1、目标 当鼠标移动到reapable scenary(可收割庄稼)上方时,光标会变成十字架。 之前章节中,Grid有Dug/Watered属性,光标移动上方时会显示方框。 而这次的功能并非基于Grid的属性,而是基于scenary&#x…...
什么是 MCP?AI 应用的“USB-C”标准接口详解
目录 🧩 什么是 MCP?AI 应用的“USB-C”标准接口详解 📌 背景与动机 🧠 核心概念 🏗️ 技术架构 🚀 应用场景 🧩 什么是 MCP?AI 应用的“USB-C”标准接口详解 📌 背…...
狼人杀中的智能策略:解析AI如何理解复杂社交游戏
想要掌握如何将大模型的力量发挥到极致吗?叶梓老师带您深入了解 Llama Factory —— 一款革命性的大模型微调工具(限时免费)。 1小时实战课程,您将学习到如何轻松上手并有效利用 Llama Factory 来微调您的模型,以发挥其…...
10 基于Gazebo和Rviz实现导航仿真,包括SLAM建图,地图服务,机器人定位,路径规划
在9中我们已经实现了机器人的模块仿真,现在要在这个基础上实现SLAM建图,地图服务,机器人定位,路径规划 1. 还是在上述机器人的工作空间下,新建功能包(nav),导入依赖 gmapping ma…...
jmeter-Beashell获取请求body data
在使用JMeter的BeanShell处理器或BeanShell断言中获取HTTP请求的body数据,可以通过几种方式实现。下面是一些常用的方法: 方法1:使用prev变量 在BeanShell处理器或断言中,prev变量可以用来访问最近的sampler(采样器&…...
区块链密码学核心
文章目录 概要1. 基础密码学哈希函数(Hash Function)对称加密与非对称加密数字签名(Digital Signature)密钥管理 2. 区块链专用密码学技术零知识证明(Zero-Knowledge Proof, ZKP)同态加密(Homom…...
Git 多账号切换及全局用户名设置不生效问,GIT进行上传无权限问题
解决 Git 多账号切换及全局用户名设置不生效问题 在软件开发过程中,我们经常会使用 Git 进行版本控制。有时,我们需要在同一台机器上管理多个 Git 账号,最近我在进行使用git的时候因为项目要进行上传的不同的git账号,但是通过本地…...
阿里云服务迁移实战: 04-IP 迁移
普通过户 如资料过户按量付费EIP所述,如果原账号是个人账号,则目标账号无限制,如果原账号是企业账号,则目标账号必须为相同认证主体的企业账号。 其主要操作就是,在原账号发起过户,在新账号接收过户。具体…...
探索PyTorch中的空间与通道双重注意力机制:实现concise的scSE模块
探索PyTorch中的空间与通道双重注意力机制:实现concise的scSE模块 在深度学习领域,尤其是在计算机视觉任务中,特征图的注意力机制变得越来越重要。近期,我在研究一种结合了通道和空间两种注意力机制的模块——Concise Spatial an…...
关闭正点原子atk-qtapp-start.service
# 查找相关服务 systemctl list-units --typeservice --staterunning # 查看详细信息 systemctl status atk-qtapp-start.service >> ● atk-qtapp-start.service - Qt App Start …...
[按键安卓ios脚本辅助插件开发]数组排序函数例子
按键安卓ios工具辅助脚本插件开发教程,教程目的是让大家掌握Lua基本语法与按键精灵手机版的插件开发制作。 在按键精灵中排序需要我们自己写算法实现,例如快速排序,冒泡排序等,而在Lua中有内置的table.sort()排序命令。 这个命令…...
【BotSharp框架示例 ——实现聊天机器人,并通过 DeepSeek V3实现 function calling】
BotSharp框架示例 ——实现聊天机器人,并通过 DeepSeek V3实现 function calling 一、一点点感悟二、创建项目1、创建项目2、添加引用3、MyWeatherPlugin项目代码编写4、WeatherApiDefaultService项目代码编写5、WebAPI MyWeatherAPI 的项目代码编写6、data文件夹中…...
记录一个单独读取evt.bdf的方法
问题描述 之前只能使用eeglab的工具,读取博瑞康达的data.bdf和evt.bdf时,使用的是eeglab的下面这个读取文件的插件。 evt.bdf使用记事本文件查看是乱码的形式。 实现方法 事实上,我们可以直接对这个文件的16进制进行解析。 对文件的位和…...
是否想要一个桌面哆啦A梦的宠物
是否想拥有一个在指定时间喊你的桌面宠物呢(手动狗头) 如果你有更好的想法,欢迎提出你的想法。 是否考虑过跟开发者一对一,提出你的建议(狗头)。 https://wwxc.lanzouo.com/idKnJ2uvq11c 密码:bbkm...
防爆风扇储能轴流风机风量风压如何保障通风安全?
在化工车间、煤矿巷道等高危环境中,通风安全是保障生产与人员生命安全的关键防线。防爆风扇储能轴流风机凭借独特的风量风压设计与性能优势,成为守护通风安全的可靠屏障。那么,它究竟是如何发挥作用的呢? 从风量设计来看,防爆风…...
Centos 7系统 宝塔部署Tomcat项目(保姆级教程)
再看文章之前默认已经安装好系统,可能是云系统,或者是虚拟机。 宝塔安装 这个比较简单,参考这个老哥的即可: https://blog.csdn.net/weixin_42753193/article/details/125959289 环境配置 进入宝塔面板之后会出现环境安装&…...
Electron读取本地文件
在 Electron 应用中,可以使用 Node.js 的 fs 模块来读取本地文件。以下是如何实现这一功能的详细步骤。 1. 设置项目结构 假设你的项目目录如下: my-electron-app/ ├── main.js ├── index.html └── renderer.js2. 使用 fs 模块读取文件 在主…...
Plesk 下的 IP 地址管理
Plesk是一个方便管理的控制面板,可以简化网站主机和服务器数据中心的自动化管理。它专为提供Windows和Linux服务器的供应商设计。Plesk面板适用于虚拟主机和独立服务器 服务器管理员可以使用Plesk来配置新网站、电子邮件系统和转售商账户,也可以通过Ple…...
基于STM32、HAL库的DS28E15P安全验证及加密芯片驱动程序设计
一、简介: DS28E15P是Maxim Integrated (现为Analog Devices)生产的一款1-Wire EEPROM芯片,具有以下特点: 1-Wire接口通信,仅需单根数据线加地线 1024位(128字节)EEPROM存储器 每个器件具有唯一的64位ROM ID 工作电压范围:2.8V至5.25V 内置CRC16校验功能 可编程写保护功能…...
浅析localhost、127.0.0.1 和 0.0.0.0的区别
文章目录 三者的解释三者的核心区别总结使用场景示例什么是回环地址常见问题开发工具中的地址使用为什么开发工具同时支持localhost和127.0.0.1?实际应用示例VSCode中的Live Server插件VSCode中的VUE项目IDEA中的Spring Boot应用 最佳实践建议 localhost、 127.0.0…...
antd+react实现html图片预览效果
import { Image } from ‘antd’; import { useEffect, useRef, useState } from ‘react’; import styles from ‘./index.module.less’; interface PreviewHtmlWithImagesProps { htmlContent: string; } const PreviewHtmlWithImages: React.FC ({ htmlContent }) >…...
【React】轻松掌握 React 中 useEffect的使用
你有没有想过,为什么你的 React 组件能够轻松应对周围发生的变化,比如每当有新数据到来时自动更新,或者处理可以动态响应实时事件的组件?这就是 useEffect 的用武之地!这个强大的钩子(Hook)就像…...
请简述一下什么是 Kotlin?它有哪些特性?
1 JVM 语言的共性:编译成字节码文件 Kotlin 和 Java 同属于 JVM(Java Virtual Machine)语言,它们的代码最终都会被编译成 JVM 字节码(.class)文件。 编译流程: Kotlin 编译:Kotli…...
Post与Get以及@Requestbody和@Pathvariable标签的应用
Post的使用场景:简单来讲适用于有安全性限制的,因为post请求的内容会被存在某个封装内容中(比如表单、jason格式等),这部分内容是不会被浏览器的cache所捕捉,安全性较强。 Get的使用场景:与pos…...
基于tabula对pdf中的excel进行识别并转换成word(三)
上一节中是基于PaddleOCR对图片中的excel进行识别并转换成word优化,本节改变思路,直接从pdf中读取表格的信息,具体思路如下所述。 PDF中的表格数据如下截图所示: 一、基于tabula从PDF中提取表格 df_list tabula.read_pdf("…...
k8s集群环境部署业务系统
k8s集群环境部署业务系统,通过shell脚本整合部署过程,简化部署流程。操作流程如下: A,B为业务系统服务名。 一.部署前准备。在k8s集群各节点执行该脚本,完成业务系统镜像加载。 #!/bin/bash # 1.删除deployment ech…...
MySQL 8.4.4 安全升级指南:从漏洞修复到版本升级全流程解析
目录 二、升级前关键注意事项 1. 数据安全与备份 2. 版本兼容性与路径规划 三、分步升级操作流程 1. 环境预检与准备 2. 安装包部署 3. 强制升级组件 4. 验证与启动 一、背景与必要性 近期安全扫描发现生产环境的 MySQL 数据库存在多个高危漏洞(CVE 详情参见Oracle 官…...
“假读“操作在I2C接收流程中的原因
在I2C接收流程中,"假读"操作是NXP I2C控制器工作特性要求的必要操作,具体原因如下: // 接收函数关键代码 void i2c_master_read(I2C_Type *base, unsigned char *buf, unsigned int size) {// ...dummy base->I2DR; /* 假读 *…...
TA学习之路——2.3图形的HLSL常用函数详解
1.基本数学运算 函数作用max(a,b)返回a,b值中较大的那个min(a,b)返回a,b值中较小的那个mul(a,b两变量相乘,常用于矩阵abs(a)返回a的绝对值sqrt(x)返回x的平方根rsqrt(x)返回x的平方根的倒数degrees(x)将弧度转成角度radians(x)将角度转成弧度noise(x)噪声函数1.1 创建一个测试…...
Python数据容器:数据容器的分类、数据容器特点总结、各数据容器遍历的特点、数据容器通用操作(统计,转换,排序)
目录 数据容器的分类 数据容器特点总结 数据容器遍历的特点 通用操作 通用统计len()、max()、min() 通用转换list()、tuple()、str()、set() 通用排序sorted 数据容器的分类 分类: 是否支持下标索引 支持:列表、元组、字符串-序列类型不支持&…...
FastAPI的发展历史
参考:https://zhuanlan.zhihu.com/p/710831974 FastAPI 于 2019 年发布,由 Sebastian Ramirez 创建。他是 Pydantic 框架的创建者,也是多个开源项目的贡献者。 FastAPI 的设计初衷是为了解决 Python Web 框架在数据类型验证和文档生成方面的问…...
本地大模型编程实战(28)查询图数据库NEO4J(1)
本文将基于langchain 框架,用LLM(大语言模型)查询图数据库NEO4J。 使用 qwen2.5 做实验,用 llama3.1 查不出内容。 文章目录 安装 NEO4J准备图数据查询图数据总结代码 安装 NEO4J 参见:在windows系统中安装图数据库NEO4J 。 准备图数据 我…...
从厨房到云端:从预制菜到云原生
小美:小猿,你最近在忙什么呢?看你总是加班。 小猿:唉,公司在搞什么“云原生”改造,说是要把我们的应用搬到云上,搞得我头都大了。 小美:云原生?听起来很高大上啊&#…...
单片机-89C51部分:9、串行口通讯
飞书文档https://x509p6c8to.feishu.cn/wiki/WSh3wnADkixHspk7kc8c5esRnad 一、什么是串口?它的作用? 串行口,简称为串口,什么是串口?它的作用是什么? 两个人交流,一般通过在说话在空气中产生…...
C++程序退出时的对象析构陷阱:深度解析与避坑指南
C++程序退出时的对象析构陷阱:深度解析与避坑指南 一、从诡异案例说起:局部对象为何"神秘消失"?二、全局对象 vs 局部对象1. 全局对象生命周期2. 局部对象生命周期三、程序终止的两种姿势:exit() vs return四、atexit():最后的救命稻草1.基础用法2. 核心特性3…...
为什么 Vite 速度比 Webpack 快?
一、webpack会先进行编译,再运行,vite会直接启动,再按需编译文件。 首先看两张图,可以清晰的看到,上面的图是webpack编译过的,而下面的图是vite直接使用工程内文件。 二、区别于Webpack先打包的方式&am…...
指针变量存放在哪?
指针的存储位置取决于其声明方式和作用域,以下是详细分析: 1. 栈(Stack) 局部指针变量:在函数内部声明的指针(非静态),作为局部变量存储在栈中。void func() {int *p; // p本身存储…...
Kafka 消息可靠性深度解析:大流量与小流量场景下的设计哲学
在分布式消息系统的设计中,消息可靠性保障本质上是系统在一致性、可用性、吞吐量三者之间动态博弈的结果。Kafka作为现代流式架构的核心组件,其消息可靠性机制在不同流量场景下呈现出截然不同的设计哲学。本文将从系统设计原理层面,解构大流量…...
python数据分析(六):Pandas 多数据操作全面指南
Pandas 多数据操作全面指南:Merge, Join, Concatenate 与 Compare 1. 引言 在数据分析工作中,我们经常需要处理多个数据集并将它们以各种方式组合起来。Pandas 提供了多种强大的多数据操作方法,包括合并(merge)、连接(join)、连接(concaten…...
在K8S迁移节点kubelet数据存储目录
默认k8s节点kubelet数据目录在 /var/lib/kubelet,如果在部署前没有做好规划,其实默认就存储在系统盘/分区下了,这样会导致一个问题,如果数据量过大会导致kubelet服务异常,其次,系统盘下有一些系统服务引用&…...
k8s 学习记录 (六)_Pod 污点和容忍性详解
一、前言 在 Kubernetes 集群中,我们已经了解了节点亲和性和 Pod 亲和性,它们在 Pod 调度方面提供了很大的灵活性。今天,我们来探讨另外两个重要的概念 ——Pod 污点(Taints)和容忍性(Tolerations…...
hutools工具类中isNotEmpty与isNotBlank区分
基于以下两种情况。在判断的变量是String类型时, 判断是否为空,推荐使用isNotBlank(). 1. isNotEmpty 不会验证str中是否含有空字符串,而 isNotBlank方法会验证 public static boolean isNotEmpty(CharSequence str) {return false isEmpty…...
C#解析USB - HID手柄上摇杆按键数据
1. 了解相关知识 HID设备通信原理:HID设备通过端点报告其状态和数据,设备通过报告描述符来描述数据用途,操作系统通过这个描述符了解设备发送数据的结构。通常一个完整的报告以特定的格式从设备传输至主机。Windows API函数…...
k8s术语pod
Pod概览 理解Pod Pod是kubernetes中你可以创建和部署的最小也是最简的单位,pod代表着集群中运行的进程。 Pod中封装着应用的容器(有的情况下是好几个容器),存储、独立的网络IP,管理容器如何运行的策略选项。Pod代表着部署的一个单位:kubemetes中应用的一个实例,可能由一个…...