六十天前端强化训练之第十四天之深入理解JavaScript异步编程
=====欢迎来到编程星辰海的博客讲解======
目录
一、异步编程的本质与必要性
1.1 单线程的JavaScript运行时
1.2 阻塞与非阻塞的微观区别
1.3 异步操作的性能代价
二、事件循环机制深度解析
2.1 浏览器环境的事件循环架构
核心组件详解:
2.2 执行顺序实战分析
2.3 Node.js事件循环特殊机制
三、Promise技术全解
3.1 Promise实现原理
状态机模型:
3.2 链式调用实现机制
3.3 错误传播机制
四、async/await底层原理
4.1 Generator函数基础
4.2 协程(Coroutine)实现
4.3 async函数的编译转换
五、高级异步模式
5.1 竞态条件处理
5.2 请求取消机制
5.3 高阶异步函数
六、浏览器异步API全景图
6.1 定时器家族
6.2 Web Workers通信
七、Node.js异步特色
7.1 非阻塞I/O实现
7.2 文件系统操作对比
7.3 Stream处理大文件
八、性能优化关键点
8.1 避免Promise内存泄漏
8.2 合理控制并发量
8.3 定时器优化策略
九、调试技巧与工具
9.1 Chrome DevTools功能
9.2 Node.js调试方法
9.3 可视化分析工具
十、企业级应用实践
10.1 错误监控体系
10.2 服务端渲染中的异步处理
十一、浏览器与Node.js事件循环差异对比
11.1 执行上下文区别
11.2 定时器精度实验
十二、异步编程设计模式
12.1 发布订阅模式
12.2 管道模式
十三、异步状态管理挑战
13.1 Redux异步方案对比
13.2 状态时序问题示例
十四、Web Worker高级应用
14.1 线程池实现
十五、TypeScript异步增强
15.1 异步类型标注
15.2 异步工具类型
十六、性能优化进阶
16.1 内存泄漏检测
16.2 CPU Profiling技巧
十七、测试异步代码
17.1 Jest异步测试模式
17.2 Mock异步依赖
十八、前沿异步技术展望
18.1 Top-Level Await
18.2 WebAssembly异步集成
一、异步编程的本质与必要性
1.1 单线程的JavaScript运行时
- V8引擎的单线程特性
- 主线程执行栈的运作原理
- 为什么需要异步模型:
- 避免UI冻结(浏览器场景)
- 处理高并发I/O(Node.js场景)
- 有效利用硬件资源
1.2 阻塞与非阻塞的微观区别
JAVASCRIPT
// 同步阻塞示例 function syncReadFile() {const data = fs.readFileSync('largefile.txt'); // 阻塞点console.log(data);console.log('后续操作'); // 长时间等待后才执行 }// 异步非阻塞示例 function asyncReadFile() {fs.readFile('largefile.txt', (err, data) => {console.log(data);});console.log('后续操作'); // 立即执行 }
1.3 异步操作的性能代价
- 上下文切换成本
- 内存占用分析
- 回调队列管理开销
- 与多线程模型的对比:
特性 异步单线程 多线程模型 内存占用 较低 较高(线程堆栈开销) 开发复杂度 较高(回调地狱) 中等(需处理锁问题) CPU密集型任务 不适用 适用 I/O密集型任务 优势明显 需要大量线程
二、事件循环机制深度解析
2.1 浏览器环境的事件循环架构
核心组件详解:
-
调用栈(Call Stack)
- FILO(先进后出)结构
- 执行上下文管理
- 栈溢出保护机制
-
任务队列(Task Queue)
- 宏任务类型:
- setTimeout/setInterval
- I/O操作
- UI渲染
- 事件回调(click等)
- 先进先出(FIFO)执行
- 宏任务类型:
-
微任务队列(Microtask Queue)
- 优先级高于宏任务
- 包含:
- Promise.then
- MutationObserver
- queueMicrotask
- 执行时机:每个宏任务执行后清空
2.2 执行顺序实战分析
JAVASCRIPT
console.log('脚本启动');setTimeout(() => console.log('定时器回调'), 0);Promise.resolve().then(() => console.log('Promise微任务1')).then(() => console.log('Promise微任务2'));queueMicrotask(() => console.log('直接微任务'));console.log('脚本结束');/* 输出顺序:脚本启动脚本结束Promise微任务1直接微任务Promise微任务2定时器回调 */
2.3 Node.js事件循环特殊机制
- 阶段划分:
- timers(定时器阶段)
- pending callbacks(系统回调)
- idle, prepare(内部使用)
- poll(轮询阶段)
- check(setImmediate)
- close callbacks
- process.nextTick专用队列
- setImmediate与setTimeout(0)的区别
三、Promise技术全解
3.1 Promise实现原理
状态机模型:
TYPESCRIPT
enum PromiseState {PENDING,FULFILLED,REJECTED }class MyPromise {private state: PromiseState = PENDING;private value: any;private handlers: Function[] = [];constructor(executor) {const resolve = (value) => {if (this.state !== PENDING) return;this.state = FULFILLED;this.value = value;this.handlers.forEach(h => h());};const reject = (reason) => {if (this.state !== PENDING) return;this.state = REJECTED;this.value = reason;this.handlers.forEach(h => h());};try {executor(resolve, reject);} catch (e) {reject(e);}}then(onFulfilled, onRejected) {return new MyPromise((resolve, reject) => {const handler = () => {try {const callback = this.state === FULFILLED ? onFulfilled : onRejected;const result = callback(this.value);resolve(result);} catch (e) {reject(e);}};if (this.state !== PENDING) {queueMicrotask(handler);} else {this.handlers.push(handler);}});} }
3.2 链式调用实现机制
JAVASCRIPT
const promiseChain = new Promise(res => res(1)).then(v => {console.log(v); // 1return v * 2;}).then(v => {console.log(v); // 2return new Promise(r => setTimeout(() => r(v * 3), 1000));}).then(v => {console.log(v); // 6(1秒后输出)});/*执行过程解析:1. 初始promise立即resolve(1)2. 第一个then接收1,返回2(同步值)3. 第二个then接收2,返回新Promise4. 第三个then等待1秒后接收6 */
3.3 错误传播机制
JAVASCRIPT
function riskyOperation() {return new Promise((resolve, reject) => {if (Math.random() > 0.5) {resolve('Success');} else {reject(new Error('Random failure'));}}); }riskyOperation().then(result => {console.log('第一阶段成功:', result);return result.toUpperCase(); // 可能抛出TypeError}).then(null, err => { // 捕获前序错误console.warn('第一阶段错误:', err.message);return 'Fallback Value';}).then(finalResult => {console.log('最终结果:', finalResult);}).catch(finalError => { // 兜底捕获console.error('未处理的错误:', finalError);});
四、async/await底层原理
4.1 Generator函数基础
JAVASCRIPT
function* asyncGenerator() {const data1 = yield fetchData1();const data2 = yield fetchData2(data1);return processData(data2); }// 手动执行器 const gen = asyncGenerator(); gen.next().value.then(data1 => gen.next(data1).value).then(data2 => gen.next(data2).value).then(final => console.log(final));
4.2 协程(Coroutine)实现
- 执行权移交机制
- 上下文保留与恢复
- 与线程调度的区别
4.3 async函数的编译转换
Babel转译示例:
JAVASCRIPT
// 原始代码 async function example() {const a = await getA();const b = await getB(a);return a + b; }// 转译结果 function example() {return _asyncToGenerator(function* () {const a = yield getA();const b = yield getB(a);return a + b;})(); }function _asyncToGenerator(fn) {return function () {const gen = fn.apply(this, arguments);return new Promise((resolve, reject) => {function step(key, arg) {try {const { value, done } = gen[key](arg);if (done) {resolve(value);} else {Promise.resolve(value).then(val => step("next", val),err => step("throw", err));}} catch (error) {reject(error);}}step("next");});}; }
五、高级异步模式
5.1 竞态条件处理
JAVASCRIPT
let lastRequestId = 0;async function search(query) {const requestId = ++lastRequestId;const result = await fetch(`/api?q=${query}`);if (requestId !== lastRequestId) {throw new Error('Obsolete request');}return result.json(); }// 使用示例 input.addEventListener('input', async () => {try {const results = await search(input.value);renderResults(results);} catch (err) {if (err.message !== 'Obsolete request') {showError(err);}} });
5.2 请求取消机制
JAVASCRIPT
const abortController = new AbortController();async function fetchWithCancel() {try {const response = await fetch('/api/data', {signal: abortController.signal});return response.json();} catch (err) {if (err.name === 'AbortError') {console.log('请求被主动取消');} else {throw err;}} }// 取消请求 abortController.abort();
5.3 高阶异步函数
JAVASCRIPT
function retry(asyncFn, times = 3, delay = 1000) {return async function (...args) {let lastError;for (let i = 0; i < times; i++) {try {return await asyncFn(...args);} catch (err) {lastError = err;await new Promise(r => setTimeout(r, delay));}}throw lastError;}; }// 使用示例 const reliableFetch = retry(fetch, 3); reliableFetch('https://api.example.com/data');
六、浏览器异步API全景图
6.1 定时器家族
API | 精度 | 最小间隔 | 适用场景 |
---|---|---|---|
setTimeout | 一般(4ms) | 1ms | 单次延迟任务 |
setInterval | 一般 | 1ms | 周期重复任务 |
requestAnimationFrame | 高(~16ms) | 屏幕刷新率 | 动画场景 |
queueMicrotask | 立即 | 无延迟 | Promise回调 |
requestIdleCallback | 低 | 50ms | 后台低优先级任务 |
6.2 Web Workers通信
JAVASCRIPT
// 主线程 const worker = new Worker('worker.js'); worker.postMessage({ type: 'CALC', data: bigArray });worker.onmessage = (e) => {console.log('计算结果:', e.data.result); };// worker.js self.onmessage = (e) => {if (e.data.type === 'CALC') {const result = heavyCalculation(e.data.data);self.postMessage({ result });} };
七、Node.js异步特色
7.1 非阻塞I/O实现
7.2 文件系统操作对比
JAVASCRIPT
// 同步版本 try {const data = fs.readFileSync('file.txt');console.log(data); } catch (err) {console.error(err); }// 异步回调版本 fs.readFile('file.txt', (err, data) => {if (err) return console.error(err);console.log(data); });// Promise版本 fs.promises.readFile('file.txt').then(console.log).catch(console.error);// async/await版本 async function readFile() {try {const data = await fs.promises.readFile('file.txt');console.log(data);} catch (err) {console.error(err);} }
7.3 Stream处理大文件
JAVASCRIPT
const readStream = fs.createReadStream('input.mp4'); const writeStream = fs.createWriteStream('output.mp4');readStream.on('data', (chunk) => {writeStream.write(transformChunk(chunk));}).on('end', () => {writeStream.end();console.log('文件处理完成');}).on('error', (err) => {console.error('处理失败:', err);});
八、性能优化关键点
8.1 避免Promise内存泄漏
JAVASCRIPT
// 错误示例:未处理的Promise链 function leakyOperation() {fetchData() // 返回Promise.then(processData) // 未处理可能的拒绝.then(updateUI); }// 正确做法: function safeOperation() {fetchData().then(processData).then(updateUI).catch(err => console.error('处理失败:', err)); }
8.2 合理控制并发量
JAVASCRIPT
async function controlledConcurrency(tasks, maxConcurrent = 5) {const results = [];const executing = new Set();for (const task of tasks) {const p = task();executing.add(p);p.finally(() => executing.delete(p));if (executing.size >= maxConcurrent) {await Promise.race(executing);}}return Promise.all(tasks.map(t => t())); }// 使用示例 const fetchTasks = Array(20).fill(() => fetch('https://api.example.com/data')); controlledConcurrency(fetchTasks);
8.3 定时器优化策略
JAVASCRIPT
// 不良实践:高频定时器 setInterval(() => {updateAnimation(); // 可能造成帧丢失 }, 10);// 优化方案:使用rAF function animate() {updateAnimation();requestAnimationFrame(animate); } animate();// 需要精确计时时: let lastTime = Date.now(); function preciseUpdate() {const now = Date.now();const delta = now - lastTime;if (delta >= 1000/60) { // 60FPSupdateLogic(delta);lastTime = now;}requestAnimationFrame(preciseUpdate); }
九、调试技巧与工具
9.1 Chrome DevTools功能
- 异步堆栈追踪:勾选"Async"选项
- Performance面板:分析任务调度
- Console面板:直接调试Promise
JAVASCRIPT
// 将Promise保留为全局变量 const globalPromise = fetchData();// 在控制台输入: await globalPromise;
9.2 Node.js调试方法
BASH
# 启动调试 node --inspect-brk app.js# Chrome访问 chrome://inspect
9.3 可视化分析工具
- JS Visualizer 9000
- Promisees
- LatentFlip Event Loop
十、企业级应用实践
10.1 错误监控体系
JAVASCRIPT
// 全局Promise错误捕获 window.addEventListener('unhandledrejection', event => {sendToMonitoring({type: 'UNHANDLED_REJECTION',reason: event.reason,stack: event.reason.stack}); });// async函数统一错误处理 async function safeAsync(fn) {try {return await fn();} catch (err) {captureException(err);throw err; // 保持原有行为} }// 使用示例 safeAsync(() => fetchCriticalData());
10.2 服务端渲染中的异步处理
JAVASCRIPT
async function serverRender(req) {const dataPromise = fetchSSRData(req);const templatePromise = readTemplateFile();const [data, template] = await Promise.all([dataPromise,templatePromise]);return renderToString(<App data={data} template={template} />); }
十一、浏览器与Node.js事件循环差异对比
11.1 执行上下文区别
环境特征 | 浏览器环境 | Node.js环境 |
---|---|---|
全局对象 | window | global |
微任务执行时机 | 每个宏任务后 | 每个阶段切换时 |
优先级任务类型 | 动画回调优先 | I/O回调优先 |
典型阻塞操作 | 长时间JS执行 | 同步文件操作 |
进程模型 | 多进程(标签页独立) | 单进程多线程 |
11.2 定时器精度实验
JAVASCRIPT
// 精度测试代码 function testTimerAccuracy() {const start = Date.now();setTimeout(() => {const end = Date.now();console.log(`实际延迟: ${end - start}ms`);}, 100); }// 浏览器典型输出:实际延迟: 104ms // Node.js典型输出:实际延迟: 105ms
十二、异步编程设计模式
12.1 发布订阅模式
JAVASCRIPT
class AsyncEventEmitter {constructor() {this.events = new Map();}on(event, listener) {if (!this.events.has(event)) {this.events.set(event, []);}this.events.get(event).push(listener);}async emit(event, ...args) {const listeners = this.events.get(event) || [];for (const listener of listeners) {await listener(...args);}} }// 使用示例 const db = new AsyncEventEmitter();db.on('query', async (sql) => {console.log(`执行查询: ${sql}`);await new Promise(r => setTimeout(r, 100)); });db.emit('query', 'SELECT * FROM users');
12.2 管道模式
JAVASCRIPT
function createAsyncPipeline(...middlewares) {return function(input) {return middlewares.reduce((chain, middleware) => chain.then(middleware), Promise.resolve(input));}; }// 中间件示例 const validateInput = data => {if (!data.userId) throw new Error('Missing userId');return data; };const fetchUser = data => fetch(`/users/${data.userId}`).then(res => res.json());const processData = user => ({...user,name: user.name.toUpperCase() });// 组合管道 const userPipeline = createAsyncPipeline(validateInput,fetchUser, processData );userPipeline({ userId: 123 }).then(console.log).catch(console.error);
十三、异步状态管理挑战
13.1 Redux异步方案对比
方案 | 优点 | 缺点 |
---|---|---|
Redux-Thunk | 简单易用 | 回调地狱风险 |
Redux-Saga | 强大异步控制 | 学习曲线陡峭 |
Redux-Observable | 响应式编程优势 | RxJS知识依赖 |
RTK Query | 内置缓存/自动管理 | 灵活性相对受限 |
13.2 状态时序问题示例
JAVASCRIPT
let currentSearchId = 0;async function handleSearch(input) {const searchId = ++currentSearchId;const results = await fetchResults(input);// 检查是否为最新请求if (searchId !== currentSearchId) {console.log('过时结果已丢弃');return;}updateUI(results); }// 输入频繁触发时,只保留最后一次结果 searchInput.addEventListener('input', e => handleSearch(e.target.value));
十四、Web Worker高级应用
14.1 线程池实现
JAVASCRIPT
class WorkerPool {constructor(size = navigator.hardwareConcurrency || 4) {this.pool = Array(size).fill().map(() => ({worker: new Worker('worker.js'),busy: false}));}exec(taskData) {const freeWorker = this.pool.find(w => !w.busy);if (!freeWorker) {return Promise.reject('All workers busy');}freeWorker.busy = true;return new Promise((resolve, reject) => {freeWorker.worker.onmessage = e => {freeWorker.busy = false;resolve(e.data);};freeWorker.worker.postMessage(taskData);});} }// 使用示例 const pool = new WorkerPool(); pool.exec({type: 'imageProcess', data: imageBuffer}).then(processed => updateImage(processed));
14.2 SharedArrayBuffer通信
JAVASCRIPT
// 主线程 const sharedBuffer = new SharedArrayBuffer(1024); const view = new Uint8Array(sharedBuffer);worker.postMessage({ buffer: sharedBuffer });// Worker线程 self.onmessage = function(e) {const sharedView = new Uint8Array(e.data.buffer);Atomics.add(sharedView, 0, 1); // 线程安全操作 };
十五、TypeScript异步增强
15.1 异步类型标注
TYPESCRIPT
interface User {id: number;name: string; }// 明确标注异步函数返回类型 async function fetchUser(id: number): Promise<User> {const response = await fetch(`/users/${id}`);return response.json(); }// 处理可能为null的情况 async function findUser(name: string): Promise<User | null> {try {const users = await fetchUsers();return users.find(u => u.name === name) || null;} catch {return null;} }
15.2 异步工具类型
TYPESCRIPT
type AsyncReturnType<T> = T extends (...args: any[]) => Promise<infer R> ? R : never;async function getData(): Promise<string[]> {return ['a', 'b', 'c']; }type DataType = AsyncReturnType<typeof getData>; // string[]// 高级类型组合 interface ApiResponse<T> {data: T;status: number; }async function fetchApi<T>(url: string): Promise<ApiResponse<T>> {// 实现... }type UserResponse = ApiResponse<User>;
十六、性能优化进阶
16.1 内存泄漏检测
Chrome Memory面板操作步骤:
- 录制堆内存快照
- 执行可疑操作多次
- 再次录制并对比
- 查看Retained Size异常的Promise对象
- 检查未释放的事件监听器
16.2 CPU Profiling技巧
JAVASCRIPT
// 标记时间线 console.time('criticalSection'); await performCriticalOperation(); console.timeEnd('criticalSection');// 性能分析包裹函数 function profile(target, name, descriptor) {const original = descriptor.value;descriptor.value = async function(...args) {const start = performance.now();const result = await original.apply(this, args);console.log(`${name}耗时: ${performance.now() - start}ms`);return result;};return descriptor; }class DataService {@profileasync loadAllData() {// 数据加载逻辑} }
十七、测试异步代码
17.1 Jest异步测试模式
JAVASCRIPT
// 回调风格 test('fetch data with callback', done => {fetchData((err, data) => {expect(err).toBeNull();expect(data).toHaveProperty('id');done();}); });// Promise风格 test('fetch data with promise', () => {return fetchData().then(data => {expect(data.status).toBe(200);}); });// async/await风格 test('async/await test', async () => {const data = await fetchData();expect(data.items).toHaveLength(10); });
17.2 Mock异步依赖
JAVASCRIPT
// Mock定时器 jest.useFakeTimers();test('debounce works', async () => {const mockFn = jest.fn();const debounced = debounce(mockFn, 100);debounced();debounced();jest.runAllTimers();expect(mockFn).toHaveBeenCalledTimes(1); });// Mock API请求 jest.mock('axios');test('fetch user', async () => {axios.get.mockResolvedValue({ data: { id: 1, name: 'Test' } });const user = await fetchUser(1);expect(user.name).toBe('Test'); });
十八、前沿异步技术展望
18.1 Top-Level Await
JAVASCRIPT
// 模块顶层直接使用await const data = await fetchConfig(); export const config = process.env.NODE_ENV === 'production' ? data.prod : data.dev;// 动态导入结合 const localeData = await import(`./locales/${navigator.language}.js`);
18.2 WebAssembly异步集成
JAVASCRIPT
async function initWasm() {const imports = {env: {async_log: async (msgPtr) => {const msg = wasmModule.getString(msgPtr);await sendLogToServer(msg);}}};const { instance } = await WebAssembly.instantiateStreaming(fetch('module.wasm'),imports);return instance.exports; }const wasmExports = await initWasm(); wasmExports.compute();
本文通过系统化的知识体系构建、丰富的代码示例和实际应用场景分析,全景式展示了JavaScript异步编程的深度与广度。建议读者按照以下步骤进行实践:
- 在Chrome中运行所有示例代码,使用调试工具观察执行流程
- 在现有项目中实施至少三种优化策略
- 构建一个包含完整错误处理机制的异步应用
- 对关键异步代码段进行性能剖析和测试
- 尝试将回调风格代码逐步重构为async/await形式
持续关注TC39提案和浏览器/Node.js的版本更新,异步编程领域仍在快速发展中,新的模式和API将不断涌现。
相关文章:

六十天前端强化训练之第十四天之深入理解JavaScript异步编程
欢迎来到编程星辰海的博客讲解 目录 一、异步编程的本质与必要性 1.1 单线程的JavaScript运行时 1.2 阻塞与非阻塞的微观区别 1.3 异步操作的性能代价 二、事件循环机制深度解析 2.1 浏览器环境的事件循环架构 核心组件详解: 2.2 执行顺序实战分析 2.3 Nod…...

集合论--形式化语言里的汇编码
如果一阶逻辑是数学这门形式化语言里的机器码,那么集合论就是数学这门形式化语言里的汇编码。 基本思想:从集合出发构建所有其它。 构建自然数构建整数构建有理数构建实数构建有序对、笛卡尔积、关系、函数、序列等构建确定有限自动机(DFA) 全景图 常…...

2025最新群智能优化算法:山羊优化算法(Goat Optimization Algorithm, GOA)求解23个经典函数测试集,MATLAB
一、山羊优化算法 山羊优化算法(Goat Optimization Algorithm, GOA)是2025年提出的一种新型生物启发式元启发式算法,灵感来源于山羊在恶劣和资源有限环境中的适应性行为。该算法旨在通过模拟山羊的觅食策略、移动模式和躲避寄生虫的能力&…...
MySQL数据实时同步至Elasticsearch的高效方案:Java实现+源码解析,一文搞定!
引言:为什么需要实时同步? MySQL擅长事务处理,而Elasticsearch(ES)则专注于搜索与分析。将MySQL数据实时同步到ES,可以充分发挥两者的优势,例如: 构建高性能搜索服务 实时数据分析…...

Spring-事务
Spring 事务 事务的基本概念 🔹 什么是事务? 事务是一组数据库操作,它们作为一个整体,要么全部成功,要么全部回滚。 常见的事务场景: 银行转账(扣款和存款必须同时成功) 订单系统…...

Git系列之git tag和ReleaseMilestone
以下是关于 Git Tag、Release 和 Milestone 的深度融合内容,并补充了关于 Git Tag 的所有命令、详细解释和指令实例,条理清晰,结合实际使用场景和案例。 1. Git Tag 1.1 定义 • Tag 是 Git 中用于标记特定提交(commit…...
考研机试常见基本题型
1、求100以内的素数 sqrt()函数在cmath头文件中。 #include <iostream> #include <cmath> using namespace std;int main() {int count 0; // 用于统计素数的个数// 遍历 100 到 200 之间的每一个数for (int num 100; num < 200; num) {bool isPrime true…...
Android AudioFlinger(四)—— 揭开PlaybackThread面纱
前言: 继上一篇Android AudioFlinger(三)—— AndroidAudio Flinger 之设备管理我们知道PlaybackThread继承自Re’fBase, 在被第一次引用的时候就会调用onFirstRef,实现如下: void AudioFlinger::Playbac…...
C语言基础系列【20】内存管理
博主介绍:程序喵大人 35- 资深C/C/Rust/Android/iOS客户端开发10年大厂工作经验嵌入式/人工智能/自动驾驶/音视频/游戏开发入门级选手《C20高级编程》《C23高级编程》等多本书籍著译者更多原创精品文章,首发gzh,见文末👇…...
JavaScript基础-递增和递减运算符
在JavaScript编程中,递增()和递减(--)运算符是用于对数值进行加一或减一操作的基础工具。它们简洁且强大,但如果不正确地使用,可能会导致混淆或错误。本文将详细介绍这两种运算符的不同形式及其…...

计算机毕业设计SpringBoot+Vue.js社区医疗综合服务平台(源码+文档+PPT+讲解)
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...

3.6c语言
#define _CRT_SECURE_NO_WARNINGS #include <math.h> #include <stdio.h> int main() {int sum 0,i,j;for (j 1; j < 1000; j){sum 0;for (i 1; i < j; i){if (j % i 0){sum i;} }if (sum j){printf("%d是完数\n", j);}}return 0; }#de…...

Unity开发——CanvasGroup组件介绍和应用
CanvasGroup是Unity中用于控制UI的透明度、交互性和渲染顺序的组件。 一、常用属性的解释 1、alpha:控制UI的透明度 类型:float,0.0 ~1.0, 其中 0.0 完全透明,1.0 完全不透明。 通过调整alpha值可以实现UI的淡入淡…...
深度学习驱动的跨行业智能化革命:技术突破与实践创新
第一章 深度学习的技术范式演进与核心架构 1.1 从传统机器学习到深度神经网络的跨越 深度学习的核心在于通过多层次非线性变换自动提取数据特征,其发展历程可划分为三个阶段:符号主义时代的规则驱动(1950s-1980s)、连接主义时代的浅层网络(1990s-2000s)以及深度学习时代…...
php配置虚拟主机
在PHP中配置虚拟主机,通常是通过Apache或Nginx等Web服务器来进行设置的。下面我将分别介绍如何在Apache和Nginx中配置PHP虚拟主机。 1. Apache 配置虚拟主机 Apache是最常用的Web服务器之一,配置虚拟主机的步骤如下: 步骤一:确保A…...

RESTful API 设计指南
RESTful API 介绍 大佬的总结:RESTful API 设计指南 - 阮一峰的网络日志 json-server github地址 这里介绍一个快速搭建 REST API 服务的工具包 接口测试工具 介绍几个接口测试工具 apipost apifox postman https://www.apipost.cn/ (中文) https://www.apifox…...
在虚拟机上安装Hadoop
以下是在虚拟机上安装Hadoop的一般步骤: 准备工作 - 安装虚拟机软件:如VMware Workstation或VirtualBox等。 - 创建虚拟机:选择合适的操作系统镜像,如Ubuntu或CentOS等Linux发行版,为虚拟机分配足够的CPU、内存和磁盘…...
大白话JavaScript实现一个函数,将字符串中的每个单词首字母大写。
大白话JavaScript实现一个函数,将字符串中的每个单词首字母大写。 答题思路 理解需求:要写一个函数,它能接收一个字符串,然后把这个字符串里每个单词的第一个字母变成大写。分解步骤 拆分单词:一般单词之间是用空格隔…...

【VUE2】第三期——样式冲突、组件通信、异步更新
目录 1 scoped解决样式冲突 2 data写法 3 组件通信 3.1 父子关系 3.1.1 父向子传值 props 3.1.2 子向父传值 $emit 3.2 非父子关系 3.2.1 event bus 事件总线 3.2.2 跨层级共享数据 provide&inject 4 props 4.1 介绍 4.2 props校验完整写法 5 v-model原理 …...
深度学习代码解读——自用
代码来自:GitHub - ChuHan89/WSSS-Tissue 借助了一些人工智能 2_generate_PM.py 功能总结 该代码用于 生成弱监督语义分割(WSSS)所需的伪掩码(Pseudo-Masks),是 Stage2 训练的前置步骤。其核心流程为&a…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力
引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...
【算法训练营Day07】字符串part1
文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接:344. 反转字符串 双指针法,两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)
Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败,具体原因是客户端发送了密码认证请求,但Redis服务器未设置密码 1.为Redis设置密码(匹配客户端配置) 步骤: 1).修…...