js异步机制
1、什么是异步机制?为什么js需要异步机制?
异步机制和同步机制是相对应的,异步是指:当代码按照顺序执行到一些比较耗时的操作,不会立刻执行,而是将这些操作推到一个队列中等待合适的时机从队列中取出任务执行(涉及到js的事件循环机制,这里不做展开),这就是js的异步机制。
因为js是单线程的,所有的JavaScript代码都在渲染主线程中执行,如果比较耗时的操作,如定时器设置了10秒后执行某项操作,如果没有异步机制,渲染主线程就会被阻塞在这里,10秒钟时间白白浪费,网页也会卡在那里不动,可想而知,用户的体验会有多差。有了异步机制,这种情况就会避免发生。
2、什么是异步操作?异步函数?回调函数?怎么实现异步机制?
异步操作是指那些比较耗时或者是需要等待的操作,比如说Dom元素事件监听,定时器操作,网络请求......
异步函数是指包含异步操作的函数,下面举个例子:
function asyncFn(){setTimeout(()=>{let result='123'},1000)
}
如上,asyncFn就是一个异步函数。里面包含setTimeout异步操作,调用asyncFn(),进入到异步函数内部,发现定时器异步操作,不会立即执行定时器任务。而是将定时器任务推到消息队列中,然后退出函数,继续向下执行。等待1000毫秒后,会将定时器任务从消息队列中取出,加入到渲染主线程中执行。
回调函数是用来接收和处理异步操作产生的结果的。比如说上面的定时器,这个异步操作在一秒钟后产生了结果‘123’,我想要将这个结果转换成一个Number类型,并且在控制台中打印出来,该怎么办呢?答案是用到一个回调函数,如下:
function asyncFn(callback){setTimeout(()=>{let result='123'callback(result)},1000)
}const callback=(res)=>{console.log(Number(res))
}asyncFn(callback)
如上,你定义一个回调函数,把他作为参数传递给异步函数。同时,将异步操作产生的结果作为参数传给回调函数,这样,就能在异步操作产生结果时,拿到这个结果,在回调函数中进行相应的操作。如此,你就实现了一种异步机制。
你可能会说,直接像下面这样不就得了吗?用的着那么麻烦?
function asyncFn(){setTimeout(()=>{let result='123'console.log(Number(result))},1000)
}
确实,上面这种方式实现了同样的功能。但是你有没有想过,setTimeout其实就是一个异步函数,他的第一个参数就是回调函数,只不过这其中的异步操作没有产生结果而已,因此他的回调函数没有接收参数。
所以,其实是一样的,只是你理解的角度不同。你把async作为异步函数,他其中的异步操作是产生了结果(定时器函数定义的变量result),你传递一个异步函数进去处理结果;你把setTimeout作为异步函数,他其中的异步操作是没有产生结果的,你只需要进行你想要的操作就是了。
3、以上这种使用异步函数+回调函数实现的异步机制有什么缺点?
首先,你需要在异步操作初始化时就定义好回调函数。而且这个异步操作产生的值只在短时间内存在,只有把这个值作为参数传给回调函数才能接收到他。
另外,想象一个需求,以上面的例子为例,如果说一秒后想把异步操作的结果变为Number类型打印出来,再过两秒把这个数字+1,再过五秒把这个数字+2......
function asyncFn(callback){setTimeout(()=>{let result='123'callback(result)},1000)
}const callback3=(num)=>{console.log(num+2)
}const callback2=(num)=>{console.log(num+1)let num2=num+1;setTimeout(()=>{callback3(num2)},5000)
}const callback=(res)=>{console.log(Number(res))let num=Number(res)setTimeout(()=>{callback2(num)},2000)
}asyncFn(callback)
如此,便实现了以上需求,虽然把每一次异步操作产生的结果都用抽离出来的回调函数进行处理,但还是会出现回调函数中嵌套调用异步函数的情况,出现回调地狱的问题。
4、一种新的异步机制,Promise(红宝书里翻译‘期约’)?
期约是es6中的一个异步编程的新机制。它的诞生解决了异步函数+回调函数实现异步机制而产生的回调地狱问题。期约是对异步操作的包装,并且能够拿到异步操作的结果,通过期约的一些实例方法可对异步操作产生的结果进行处理。
5、如何创建一个期约,期约有哪些状态?
通过new Promise(()=>{})可创建一个期约实例,参数为一个执行器函数,且这个执行器函数为必传。执行器函数中的代码同步执行,执行器函数本身有两个参数(resolve,reject),用于改变期约的状态,期约的状态改变了之后便不可逆。
通过构造函数,传递一个执行器函数创建出来的期约状态默认为待定(pending)状态,在执行器函数内部,你可以初始化异步操作,通过resolve或reject改变期约的状态为兑现(fulfilled)或拒绝(rejected),并将异步操作产生的结果存储在创建出来的Promise实例中,通过实例的方法如then方法来处理异步操作的结果。
通过Promise.resolve()可以实例化一个状态为兑现(fulfilled)的期约,该方法可将传给他的第一个参数,无论是什么类型的数据,全部包装成一个期约实例。但如果该参数本身就是一个期约实例,则相当于一个空包装,返回还是期约本身,如下:
let p=Promise.reject('1')
let p2=Promise.resolve(p)
console.log(p2)
console.log(p===p2)
通过Promise.reject()可以实例化一个状态为拒绝(rejected)的期约,该方法可以将传给他的第一个参数包装为一个状态为拒绝(rejected)的期约实例。与Promise.resolve()不同的是,如果这个参数是一个期约实例,他将作为新的期约实例的拒绝理由,如下:
let p=Promise.resolve('1')
let p2=Promise.reject(p)
console.log(p2)
console.log(p===p2)
简短对比总结Promise.resolve()和Promise.reject():
Promise.resolve()实例化出来的期约可能是兑现状态,也可能是拒绝状态(参数为一个拒绝状态的期约)。而Promise.reject()实例化出来的期约永远都是拒绝状态,且不存在幂等关系,就算传入的参数是拒绝状态的期约,也只是作为新期约的拒绝理由。
6、期约到底是同步的还是异步的,他的真实异步特性是怎样的?
通过Promise.reject()抛出错误,并不会被try/catch捕获到,且不会阻断后续代码的执行,如下:
try {Promise.reject()console.log('没有阻断执行')
}catch(e){console.log('捕获到了错误',e)
}
可以看到,没有阻断代码执行,最后异步抛出错误,没有被捕获到。
对比同步代码抛出错误:
try {throw new Error('123')console.log('没有阻断执行')
}catch(e){console.log('捕获到了错误',e)
}
错误被捕获到,阻断了代码执行,进入了catch.
由此可见,期约对象本身执行在同步模式中,但是他也是异步执行模式的媒介,错误抛出是在异步模式中,因此不会阻塞同步代码的执行。代码一旦进入异步执行模式,唯一与之交互的方式就是使用异步结构———更具体的说,就是期约的方法。如上的错误想要捕获到就是调用期约的catch方法,如
这样,就捕获到了错误。
7、期约的实例方法有哪些?调用了期约的实例方法返回新期约,新期约状态如何?
由于在Promise.prototype上定义了then,catch,finally方法,因此实例化出来的期约对象都拥有这些实例方法。
- 首先,介绍then方法,他接收onResolved和onRejected两个处理程序作为参数,分别处理期约的状态为兑现和拒绝。传给then方法的处理程序必须为函数形式,否则将被忽略。如果你只想传递onRejected处理程序,则将onResolved处理程序传为null。如下:
let p=new Promise(()=>{})
let callback=(res)=>{console.log(res)
}
//有效传递
p.then(callback)
//或者
p.then((res)=>{console.log(res)
})//无效传递
p.then('123')//只传递onRejected处理程序
p.then(null,callback)
then方法返回的新期约的状态分为以下几种情况:
A)如果没有传递任何的处理程序,新期约即和父期约一致(但不是同一个对象)。
B)如果传递了处理程序,会根据父期约的落定状态,看相应处理程序中是否有返回值,如果有返回值,则用Promise.resolve()包装这个返回值作为新期约。如果没有返回值,则用Promise.resolve包装undefined作为新期约。
C)如果在处理程序中抛出异常,则会将异常对象作为拒绝期约的理由,产生新期约。
D)如果父期约的初始状态为pending,则新期约初始的状态也为pending。待父期约的状态更新后,新期约的状态也会根据以上ABC三条规则进行更新。
- catch方法,在父期约的状态变为拒绝的时候调用。通常用来捕获异步操作的错误。
catch方法产生新期约的规则和then方法产生新期约的规则一致。
- finally方法,在父期约的状态改为兑现或拒绝的时候都会执行,通常是用来添加清理代码。
finally方法产生新期约的状态规则如下:
A)通常情况下与父期约一致,无论处理程序的返回值是什么。
B)如果返回了一个待定的期约,新期约为待定期约
C)如果在onFinally处理程序中显式抛出错误或者返回一个拒绝的期约,新期约为拒绝期约。
特别注意:
返回待定期约的情况并不常见,这是因为只要期约一解决,新期约仍然和父期约一致,而不是待定期约解决的状态。如下:
let p1=Promise.resolve('foo')
let p2=p1.finally(()=>{console.log('执行了finally')return new Promise((resolve,reject)=>{setTimeout(()=>{resolve('bar')},1000)})
})
console.log('首次p2',p2)
setTimeout(()=>{console.log('再次p2',p2)
},2000)
如果期约被拒绝,则新期约的状态为拒绝,如下:
let p1=Promise.resolve('foo')
let p2=p1.finally(()=>{console.log('执行了finally')return new Promise((resolve,reject)=>{setTimeout(()=>{reject('bar')},1000)})
})
console.log('首次p2',p2)
setTimeout(()=>{console.log('再次p2',p2)
},2000)
8、期约的非重入特性?如果一个企业有多个处理程序,他们的执行顺序是怎样的?
期约的非重入特性是指:当期约的状态发生改变时,对应期约的处理程序不是立马执行的,而是等跟在期约后面的同步代码执行完,再执行期约的处理程序。如下:
console.log('开始')
let p=Promise.resolve('1');
p.then((res)=>{console.log('处理程序执行,拿到结果:',res)
})
console.log('结束')
如果一个期约有多个处理程序,他们的执行顺序是按照添加的顺序执行的。如下:
console.log('开始')
let p=Promise.resolve('1');
p.then((res)=>{console.log('处理程序执行,拿到结果:',res)
})
p.then((res)=>{console.log('第二次处理程序执行,拿到结果:',res)
})
console.log('结束')
除了then方法的处理程序,catch,finally方法的处理程序,均遵循这个非重入特性。
9、什么是期约连锁?为什么期约能够进行链式调用?用来解决什么问题?
期约连锁就是期约的链式调用,上一步产生的结果,传递给下一个期约,产生的结果再传递给下一个期约......
因为期约的实例方法then,catch,finally返回的都是期约对象,因此期约是支持链式调用的。
期约的链式调用实际上就是用来解决回调地狱的问题的,比如前面提到的把一个字符串转换为数字,然后定时+的需求,用期约的链式调用就可避免回调地狱的问题。如下:
let p= new Promise((resolve)=>{setTimeout(()=>{let result='123'resolve(Number(result))},1000)
}).then((res)=>{console.log(res) //一秒后打印数字 123return new Promise((resolve)=>{setTimeout(()=>{let num=res+1resolve(num)},2000)})
}).then((res)=>{console.log(res) //又过2秒 打印124setTimeout(()=>{console.log(res+2) //再过5秒 打印126},5000)
})
10、什么是期约合成?期约合成的应用场景是怎样的?
将多个期约实例合成为一个期约叫做期约合成。Promise提供了两个静态方法Promise.all()和Promise.race()来完成期约合成。
Promise.all()
接收一个可迭代对象作为参数
A)可迭代对象的元素会通过Promise.resolve()转换为期约对象
B)如果可迭代对象的元素为空,相当与Promise.resolve
C)如果没有传参,或者传递的参数不是可迭代对象,会抛出错误,合成一个拒绝的期约对象
- 只有当所有传入的 Promise 都变为“已成功”(fulfilled)状态时,
Promise.all()
返回的 Promise 才会成功,其结果是一个数组,包含每个 Promise 的成功结果。 - 如果任意一个 Promise 被拒绝(rejected),
Promise.all()
返回的 Promise 会立即变为“已拒绝”(rejected)状态,拒绝理由(reason)是第一个被拒绝的 Promise 的拒绝理由。
Promise.race()
接受一个可迭代对象作为参数,关于参数处理规则,和Promise.all()处理一致。
Promise.race对于解决期约和拒绝期约不会区别对待,无论是解决还是拒绝期约,只要第一个状态落定,就会包装其解决值或拒绝值并返回新期约。
Promise.allSettled()
将可迭代对象中所有的期约全部执行完毕,得到所有的解决值或拒绝值,如下:
11、async/await是怎么实现异步机制的?他的诞生解决了什么问题?
async/await是es8的新特性,他诞生的目的是解决异步编程的代码风格问题,增加代码的可读性和可维护性。
async关键字用于声明一个异步函数,有多种方式,如下:
async function foo(){}
const foo= async function(){}
const foo= async ()=>{}
class C{async foo(){}
}
- async 声明的异步函数返回值一定是一个期约对象。期约对象的值为Promise.resolve包装的异步函数return返回值(如果没有显式return,返回值为undefined)。
- 如果在异步函数内部用throw抛出错误,异步函数会返回拒绝期约,并可用catch方法捕获。
- 但是,在异步函数内部,拒绝期约的错误不会被捕获到。因为该异步函数返回的并不是拒绝期约,而是被Promise.resolve()包装的undefined。
因为异步函数内部会包含一些耗时的异步操作,因此他需要具备暂停和恢复执行的能力。这就是await关键字的作用(类似于生成器函数中的yield)。
await关键字期待一个实现了thenable接口的对象,然后将他‘解包’。但这不是必须的,如果不是的话,这个值就被当做已解决的期约,await也会解包其中的值。
重点注意:前面提到过,在异步函数内部,拒绝期约的错误不会被捕获到。但是对拒绝的期约使用await关键字会释放错误值(将拒绝期约返回,且后面代码不会执行),如下:
async function foo(){console.log(1)await Promise.reject('2')
//以下两行代码不会执行console.log('123')return '成功'
}foo();
12、await关键字的使用有什么限制?他是怎么暂停和恢复函数的执行的?
限制:await关键字必须放在async 异步函数中使用,否则会抛出错误。
async/await实现异步机制,主要起作用的还是await关键字。因为只靠async关键字,函数的执行和普通函数没有什么太大的区别(大概只是返回值的区别)。javaScript运行时会在遇到await关键字的时候记录在哪里暂停执行。等到await右边的值可用了,javaScript运行时会向消息队列中推送一个任务,即恢复异步函数的执行。
看一个示例:
async function foo(){console.log(2);console.log(await 8);console.log(9)
}async function bar(){console.log(4)console.log(await 6);console.log(7)
}console.log(1)
foo();
console.log(3)
bar()
console.log(5)
我们来一步一步分析这段 JavaScript 代码的执行过程,特别关注异步函数(async/await
)的行为。
📜 代码分析
async function foo(){console.log(2);console.log(await 8);console.log(9)
}async function bar(){console.log(4)console.log(await 6);console.log(7)
}console.log(1)
foo();
console.log(3)
bar()
console.log(5)
🧠 JavaScript 执行机制简述
-
JavaScript 是单线程的,事件循环机制分为 同步任务 和 异步任务。
-
await
会暂停async
函数的执行,将后续代码放入 微任务队列(microtask queue) 中等待执行。 -
await 8
实际相当于await Promise.resolve(8)
,返回一个已解析的 Promise,但依旧是异步行为。
⏱ 执行顺序分析
同步代码先执行:
console.log(1) // 输出:1
foo(); // 执行 foo()console.log(2) // 输出:2await 8 // 中断 foo,后面的 console.log(9) 放入微任务
console.log(3) // 输出:3
bar(); // 执行 bar()console.log(4) // 输出:4await 6 // 中断 bar,后面的 console.log(7) 放入微任务
console.log(5) // 输出:5
此时的同步输出是:
1
2
3
4
5
接下来处理微任务队列:
-
执行
foo()
中await
后的部分:console.log(8); // await 8 的值 console.log(9);
-
然后执行
bar()
中await
后的部分:console.log(6); // await 6 的值 console.log(7);
所以微任务部分输出:
8
9
6
7
✅ 最终输出顺序为:
1
2
3
4
5
8
9
6
7
🧾 总结原因
-
async/await
是基于 Promise 的异步机制,await
会将其后代码延后至微任务队列。 -
所有同步代码先执行,
await
后的部分等当前同步和微任务执行完后才运行。
相关文章:
js异步机制
1、什么是异步机制?为什么js需要异步机制? 异步机制和同步机制是相对应的,异步是指:当代码按照顺序执行到一些比较耗时的操作,不会立刻执行,而是将这些操作推到一个队列中等待合适的时机从队列中取出任务执…...
Pycharm常用快捷键总结
主要是为了记录windows下的PyCharm的快捷键,里面的操作都试过了功能描述会增加备注。 文件操作 快捷键功能描述Ctrl N新建文件Ctrl Shift N根据名称查找文件Ctrl O打开文件Ctrl S保存当前文件Ctrl Shift S另存为Alt F12打开终端(Terminal&…...
巧记英语四级单词 Unit2-下【晓艳老师版】
mit传递(send 送)、 superiority n.优势,优越性 超越别人的东西就是自己的优势govern v.统治 government政府 统治的机构administer v.管理,治理 minister 大臣 部长,mini-小人,一再的做大臣 部长…...
走进底层 - JVM工作原理入门指南
走进底层 - JVM工作原理入门指南 Java 之所以能够实现“一次编写,到处运行”(Write Once, Run Anywhere, WORA),核心在于 Java 虚拟机(JVM, Java Virtual Machine)。JVM 是 Java 程序的运行环境,…...
windows 10频繁通知A字“出现了问题,无法安装功能。”
一、故障突现 windows 10频繁通知A字“出现了问题,无法安装功能。” 编辑文档时发现黑体、楷体gb_2312等常用字体,在字体列表中失踪,原来设置好的字体也显示失效。 二、起因分析 回想了一下,是3月27日安装了 2025-适用于Windows…...
基础环境配置
1.GitGerritjenkins Linux 远程登录 | 菜鸟教程 https://zhuanlan.zhihu.com/p/22766058062 2.Samba 配置 3.软件安装 (1)MobaXterm (2)Vscode (3)Xmind (4) Audacity Aud…...
ROS2——foxy apt打包离线安装deb包
需要从A设备复制ROS2环境到B设备,且B设备有可能没网络,所以选择制作离线资源包 1. 本机安装指令 本机环境ubuntu20.04,安装ros2-foxy版本,直接输入以下指令,基本不会遇到问题 这里安装的是ros-base版本,不…...
大数据学习(104)-clickhouse与hdfs
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言📝支持一…...
大数据 - 1. 概述
早期的计算机(上世纪70年代前) 是相互独立的,各自处理各自的数据上世纪70年代后,出现了基于TCP/IP协议的小规模的计算机互联互通。上世纪90年代后,全球互联的互联网出现。当全球互联网逐步建成(2000年左右&…...
CD25.【C++ Dev】类和对象(16) static成员(上)
目录 1.static成员变量 问题:实现一个类,计算程序中创建出了多少个类对象 设计思路 代码示例 版本1 版本2 static成员 特点1.static成员为静态成员,为所有类对象所共享(在某种程度上可以理解为全局的,用类去封装"全局变量"),存放在静态区,则不属于某个具体的…...
C语言今天开始了学习
好多年没有弄了,还是捡起来弄下吧 用的vscode 建议大家参考这个配置 c语言vscode配置 c语言这个语言简单,但是今天听到了一个消息说python 不知道怎么debug。人才真多啊...
Mockito如何对静态方法进行测试
在 Mockito 中,直接对静态方法进行模拟是困难的,因为 Mockito 的设计理念是优先通过依赖注入(DI)管理对象,而静态方法破坏了这种设计(难以解耦)。不过,从 Mockito 3.4.0 版本开始,通过 mockStatic 方法支持了对静态方法的模拟(需配合 mockito-inline 依赖)。 从 Mo…...
Three.js 入门实战:安装、基础概念与第一个场景⭐
学习本章节你不必要追求细节,你只需要了解基本的3D场景需要哪些元素组成,如何通过组成3D场景的元素属性调整来控制3D物体或者场景即可。 在上一篇文章中我们初识了 Three.js,今天我们正式进入实战环节 🎯 前置准备: …...
【QT】QT的消息盒子和对话框(自定义对话框)
QT的消息盒子和对话框(自定义对话框) 一、消息盒子QMessageBox1、弹出警告盒子示例代码:现象: 2、致命错误盒子示例代码:现象: 3、帮助盒子示例代码:现象: 4、示例代码: …...
QT面试题:内存管理与对象生命周期
题目: 在Qt中,当一个父对象被销毁时,其子对象是否会被自动释放?请结合Qt的内存管理机制说明原因,并解释在什么情况下可能导致内存泄漏。如何避免这类问题? 参考答案 父子对象的内存管理机制 …...
linux查询inode使用率
在 Linux 中,inode 用于存储文件和目录的元数据(如权限、所有者、时间戳等)。当文件系统的 inode 被耗尽时,即使磁盘空间充足,系统也会提示 No space left on device。以下是查询 inode 使用率的详细方法: …...
算法基础—二分算法
目录 一、⼆分查找例题 1 牛可乐和魔法封印 2 A-B 数对 3 烦恼的高考志愿 二、 ⼆分答案 1 木材加⼯ 2 砍树 3 跳石头 ⼆分算法的原理以及模板其实是很简单的,主要的难点在于问题中的各种各样的细节问题。因此,⼤多数情况下,只是背会…...
2024年第十五届蓝桥杯CC++大学A组--成绩统计
2024年第十五届蓝桥杯C&C大学A组--成绩统计 题目: 动态规划, 对于该题,考虑动态规划解法,先取前k个人的成绩计算其方差,并将成绩记录在数组中,记录当前均值,设小蓝已检查前i-1个人的成绩&…...
家居实用品:生活中的艺术,家的温馨源泉
在快节奏的现代生活中,家居实用品不仅是日常所需的工具,更是营造温馨家居氛围、提升生活品质的关键元素。它们以其独特的魅力,默默地融入我们的日常生活,成为连接物质世界与精神世界的桥梁。 走进家门,首先映入眼帘的或…...
TCP重传率高与传输延迟问题
目录标题 排查步骤:TCP重传率高与传输延迟问题v1.0通过 rate(node_netstat_Tcp_RetransSegs[3m]) 排查 TCP 重传问题的步骤1. **指标含义与初步分析**2. **关联指标排查**3. **定位具体问题源**4. **解决方案**5. **验证与监控** v2.0一、基础检查二、网络层分析三、…...
超越简单检索:探索知识图谱与大型语言模型的协同进化之路
摘要: 大型语言模型(LLM)在自然语言处理领域取得了革命性进展,但其在事实准确性、复杂推理和可解释性方面仍面临挑战,“幻觉”现象是其固有局限性的体现。知识图谱(KG)作为结构化人类知识的载体,…...
汽车的四大工艺
文章目录 冲压工艺核心流程关键技术 焊接工艺核心流程 涂装工艺核心流程 总装工艺核心流程终检与测试静态检查动态检查四轮定位制动转鼓测试淋雨测试总结 简单总结下汽车的四大工艺(从网上找了一张图,感觉挺全面的)。 冲压工艺 将金属板材通过…...
研发效能实践:技术评审会生存指南
文章目录 🚨开篇暴击:为什么你的评审会像「菜鸡互啄」?⚙️第一章:Google Design Sprint——5天把争议变成共识📅 Day 1-5 实操手册Map the Problem(画地图)Sketch Solutions…...
js 拷贝
在 JavaScript 中,拷贝对象和数组时需要特别注意,因为对象和数组是引用类型,直接赋值只会复制引用,而不是实际的数据。以下是几种常见的拷贝方法及其应用场景: 1. 浅拷贝(Shallow Copy) 浅拷贝…...
AI比人脑更强,因为被植入思维模型【51】效率思维模型
giszz的理解:效率实际没有用,过分的追求效率,也是当下社会的弊病。但是效率思维,让我们能够用一个最简单的模型,去平衡投入和产出的最佳比例。过高的效率,会导致过大的压力,合适是最好的。 一、…...
Spark RDD相关概念
Spark运行架构与核心组件 1.Spark运行梁构 spark运行架构包括master和slave两个主要部分。master负责管理整个集群的作业任务调度,而slave则负责实际执行任务。 dirver是Spark驱动器节点,负责执行Spark任务中的main方法,将用户程序转换成作业…...
每日一题(小白)数组娱乐篇21
由于题意可知我们是要将对应的数字转换为英文,我们要考虑两点一个是进制的转换,也就是类似于我们的十进制一到9就多一位,这里的进制就是Z进制也就是27进制一旦到26下一位则进位;另一方面要考虑数字的转换也就是1~26对应A~Z。解决上…...
LLM 的model.generate() 参数说明
LLM 的model.generate() 参数说明 目录 LLM 的model.generate() 参数说明生成长度控制参数采样策略参数重复惩罚参数束搜索参数其他参数model.generate() 方法是 Hugging Face Transformers 库中用于文本生成的核心方法,它有众多参数可用于控制生成过程 生成长度控制参数 min…...
每日一题——AB10 反转链表
ListNode* prev NULL;while(head) {ListNode* next head->next; // 先记住下一个节点head->next prev; // 把当前节点指向前一个prev head; // 前一个节点变成当前节点head next; // 当前节点移动到下一个}return prev; // …...
大模型备案语料安全要求解析
根据大模型备案法规要求及实践经验,我整理除了以下涉及到语料安全相关环节的要求,供大家参考,如果有大模型备案和算法备案的更多疑问,也可以和我沟通交流。 一、关键词库规模与覆盖范围 1.基础规模 企业需建立拦截关键词库&…...
【Ansible自动化运维】二、Playbook 深入探究:构建复杂自动化流程
在 Ansible 自动化运维体系中,Playbook 是极为关键的部分。它允许我们以一种结构化、可重复的方式定义和执行一系列复杂的任务,从而构建高效的自动化流程。本篇文章将深入探究 Ansible Playbook 的各个方面,助您掌握构建复杂自动化…...
unity 保存场景功能 可以保存运行时候地形变化和动态生成得物体,点击加载进来后可以继续上次退出时得场景
直接上代码了 using System; using System.Collections.Generic; using System.IO; using UnityEngine; using UnityEngine.UI;[System.Serializable] public class TerrainSaveData {public int heightmapResolution;public float terrainWidth;public float terrainLength;p…...
光谱相机的关键技术参数
光谱相机的关键技术参数直接影响其数据获取能力和应用场景适配性。以下是核心参数的详细解析,涵盖光谱性能、空间性能、硬件性能及环境适应性: 一、光谱性能参数 1. 光谱范围(Spectral Range) 定义:相机可…...
Linux系统管理与编程12: FTP服务配置
(本实验在CentOS7/8上完成,OpenEuler上暂时未实现) 兰生幽谷,不为莫服而不芳; 君子行义,不为莫知而止休。 1 实验目标 1)理解FTP服务器原理 2) 掌握FTP服务器的配置文件 3)具备安装部署VSFTP的能力 4) 具备FTP的故障排除能…...
乐观锁与悲观锁的使用场景
悲观锁的应用场景 悲观锁的基本思想是假设并发冲突会发生,因此在操作数据时会先锁定数据,直到完成操作并提交事务后才释放锁。这种方式适用于写操作较多、并发冲突可能性较高的场景。 高写入比例的数据库操作:如果系统中有很多写操作&#x…...
金融级隐私安全之DeepSeek R1 模型去中心化存储和推理实现方案
目录 DeepSeek R1 进入去中心化存储网络意味着什么? 它是如何工作的? Atoma、Walrus和 Sui Atoma Network 已成功将 DeepSeek R1 670B 参数推理模型上传到 Walrus 去中心化存储网络。这标志着这种规模的模型首次在去中心化存储层上可用,确保无需依赖中心化基础设施即可实…...
基于django大数据平台的交通数据可视化设计与实现(源码+lw+部署文档+讲解),源码可白嫖!
摘要 时代在飞速进步,每个行业都在努力发展现在先进技术,通过这些先进的技术来提高自己的水平和优势,基于大数据平台的交通数据可视化系统当然不能排除在外。基于大数据平台的交通数据可视化系统是在实际应用和软件工程的开发原理之上&#…...
STM32 vs ESP32:如何选择最适合你的单片机?
引言 在嵌入式开发中,STM32 和 ESP32 是两种最热门的微控制器方案。但许多开发者面对项目选型时仍会感到困惑:到底是选择功能强大的 STM32,还是集成无线的 ESP32? 本文将通过 硬件资源、开发场景、成本分析 等多维度对比…...
柳宗元经典的10首唐诗
1、最孤独的诗:《江雪》 江雪 千山鸟飞绝,万径人踪灭。 孤舟蓑笠翁,独钓寒江雪。 这首诗被誉为“唐诗五绝最佳”之作。 富于理想的“永贞革新”失败后,柳宗元被贬永州,母亲也在半年后离世。年届三十,政…...
Windows11介绍(中英文版)
一、Windows 11 的发布背景与发展历程 Windows 11 是微软公司推出的一款重要的操作系统,它是 Windows 操作系统系列的最新版本之一。微软在操作系统领域拥有悠久的历史和丰富的经验,从早期的 Windows 95 开启了图形化操作系统的新时代,到 Wi…...
使用 VSCode 本地历史记录恢复误删除文件
vsCode未知操作意外删除项目根目录入口代码文件 使用vsCode多年, 第一次遇见这种情况, 只是下载了几个插件, 可能打开的窗口太多, 有几个代码版本比对的页面, 在没有察觉的时候, 意外删除了项目根目…...
前端面试宝典---数据类型
基本数据类型 对于基本类型在创建时无需使用 new 关键字 Bigint在实际开发不常用,如果对于精度要求高可以使用第三方库,如decimal.js 基本数据类型介绍 undefined:当变量被声明但未赋值,或者函数没有返回值时,就会呈现…...
Dinky 和 Flink CDC 在实时整库同步的探索之路
摘要:本文整理自 Dinky 社区负责人,Apache Flink CDC contributor 亓文凯老师在 Flink Forward Asia 2024 数据集成(二)专场中的分享。主要讲述 Dinky 的整库同步技术方案演变至 Flink CDC Yaml 作业的探索历程,并深入…...
【Proteus仿真】【32单片机-A008】MPX4115压力检测系统设计
目录 一、主要功能 二、使用步骤 三、硬件资源 四、软件设计 五、实验现象 联系作者 一、主要功能 1、压力检测与LCD显示 2、超过上限,降压模块启动 3、压力检测范围15kpa-115kpa 4、压力阈值设置 5、超限报警 二、使用步骤 系统运行后,LCD160…...
银河麒麟系统虚拟机网络ping不通的解决方法
问题描述:使用NAT模式搭建了银河麒麟系统虚拟主机,虚拟机内部可以联网,可以查询到具体的ip地址,同时也可以在虚拟机内部ping同宿主机ip,但使用宿主机却无法ping同银河麒麟虚拟机ip,使用ssh、ftp、sftp等工具…...
spark数据清洗案例:流量统计
一、项目背景 在互联网时代,流量数据是反映用户行为和业务状况的重要指标。通过对流量数据进行准确统计和分析,企业可以了解用户的访问习惯、业务的热门程度等,从而为决策提供有力支持。然而,原始的流量数据往往存在格式不规范、…...
关于AIGC stable diffusion 在图像超分上的算法整理
参考文档: c论文阅读基于Stable Diffusion的图像超分 - 知乎 十分钟读懂Stable Diffusion运行原理 - 知乎 1.difussion model 扩散模型的基本原理 diffusion model 扩散模型是一类生成模型的统称,基于扩散过程生成数据。这类模型的核心是通过逐步加噪…...
Stable Diffusion ComfyUI 基础教程(一) ComfyUI安装与常用插件
前言: 相信大家玩 Stable Diffusion(以下简称SD)都是用的 web UI 操作界面吧,不知道有没有小伙伴听说过 ComfyUI。ComfyUI 是 一个基于节点流程的 Stable Diffusion 操作界面,可以通过流程,实现了更加精准…...
[leetcode]差分算法
一.差分算法性质 1.1计算差分数组: b[i] a[i] - a[i - 1] 1.2差分数组的性质 1.2.1对差分数组的每一项作前缀和,可以得到原来的数组 ai a1∑j1i−1dj 1.2.2将差分数组的某一项加i,那么其后面的所有项都会相对于原数组加i 让2~4项加3 这个第三…...
大数据技术之SPARK
Spark Core 什么是 RDD 代码中是一个抽象类,它代表一个弹性的、不可变、可分区、里面的元素可并行计算的集合 弹性 存储的弹性:内存与磁盘的自动切换; 容错的弹性:数据丢失可以自动恢复; 计算的弹性:…...