六十天前端强化训练之第十四天之深入理解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 线程池实现

14.2 SharedArrayBuffer通信

十五、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 浏览器环境的事件循环架构

事件循环架构图

核心组件详解:
  1. 调用栈(Call Stack)

    • FILO(先进后出)结构
    • 执行上下文管理
    • 栈溢出保护机制
  2. 任务队列(Task Queue)

    • 宏任务类型:
      • setTimeout/setInterval
      • I/O操作
      • UI渲染
      • 事件回调(click等)
    • 先进先出(FIFO)执行
  3. 微任务队列(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事件循环特殊机制

  • 阶段划分:
    1. timers(定时器阶段)
    2. pending callbacks(系统回调)
    3. idle, prepare(内部使用)
    4. poll(轮询阶段)
    5. check(setImmediate)
    6. 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); // 1
    return v * 2;
  })
  .then(v => {
    console.log(v); // 2
    return 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,返回新Promise
  4. 第三个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回调
requestIdleCallback50ms后台低优先级任务

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) { // 60FPS
    updateLogic(delta);
    lastTime = now;
  }
  
  requestAnimationFrame(preciseUpdate);
}

九、调试技巧与工具

9.1 Chrome DevTools功能

  1. 异步堆栈追踪:勾选"Async"选项
  2. Performance面板:分析任务调度
  3. 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环境
全局对象windowglobal
微任务执行时机每个宏任务后每个阶段切换时
优先级任务类型动画回调优先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面板操作步骤:

  1. 录制堆内存快照
  2. 执行可疑操作多次
  3. 再次录制并对比
  4. 查看Retained Size异常的Promise对象
  5. 检查未释放的事件监听器

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 {
  @profile
  async 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异步编程的深度与广度。建议读者按照以下步骤进行实践:

  1. 在Chrome中运行所有示例代码,使用调试工具观察执行流程
  2. 在现有项目中实施至少三种优化策略
  3. 构建一个包含完整错误处理机制的异步应用
  4. 对关键异步代码段进行性能剖析和测试
  5. 尝试将回调风格代码逐步重构为async/await形式

持续关注TC39提案和浏览器/Node.js的版本更新,异步编程领域仍在快速发展中,新的模式和API将不断涌现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/984163.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Git基础之工作原理

基础概念 git本地有三个工作区域&#xff0c;工作目录 Working Directory&#xff0c;暂存区Stage/Index和资源区Repository/Git Directory&#xff0c;如果在加上远程的git仓库就是四个工作区域 四个区域与文件交换的命令之间的关系 WorkSpace&#xff1a;工作区&#xff0c;就…

【计算机网络】计算机网络的性能指标——时延、时延带宽积、往返时延、信道利用率

计算机网络的性能指标 导读 大家好&#xff0c;很高兴又和大家见面啦&#xff01;&#xff01;&#xff01; 在上一篇内容中我们介绍了计算机网络的三个性能指标——速率、带宽和吞吐量。用大白话来说就是&#xff1a;网速、最高网速和实时网速。 相信大家看到这三个词应该就…

测试大语言模型在嵌入式设备部署的可能性-ollama本地部署测试

前言 当今各种大语言模型百花齐放&#xff0c;为了方便使用者更加自由的使用大模型&#xff0c;将大模型变成如同棒球棍一样每个人都能用&#xff0c;并且顺手方便的工具&#xff0c;本地私有化具有重要意义。 本次测试使用ollama完成模型下载&#xff0c;过程简单快捷。 1、进…

【实战篇】【DeepSeek 全攻略:从入门到进阶,再到高级应用】

凌晨三点,某程序员在Stack Overflow上发出灵魂拷问:“为什么我的DeepSeek会把财务报表生成成修仙小说?” 这个魔性的AI工具,今天我们就来场从开机键到改造人类文明的硬核教学。(文末含高危操作集锦,未成年人请在师父陪同下观看) 一、萌新村任务:把你的电脑变成炼丹炉 …

【Linux学习笔记】Linux基本指令分析和权限的概念

【Linux学习笔记】Linux基本指令分析和权限的概念 &#x1f525;个人主页&#xff1a;大白的编程日记 &#x1f525;专栏&#xff1a;Linux学习笔记 文章目录 【Linux学习笔记】Linux基本指令分析和权限的概念前言一. 指令的分析1.1 alias 指令1.2 grep 指令1.3 zip/unzip 指…

Unity DOTS从入门到精通之 自定义Authoring类

文章目录 前言安装 DOTS 包什么是Authoring1. 实体组件2. Authoring类 前言 DOTS&#xff08;面向数据的技术堆栈&#xff09;是一套由 Unity 提供支持的技术&#xff0c;用于提供高性能游戏开发解决方案&#xff0c;特别适合需要处理大量数据的游戏&#xff0c;例如大型开放世…

linux如何判断进程对磁盘是随机写入还是顺序写入?

模拟工具&性能测试工具&#xff1a;fio fio参数说明&#xff1a; filename/dev/sdb1&#xff1a;测试文件名称&#xff0c;通常选择需要测试的盘的data目录。 direct1&#xff1a;是否使用directIO&#xff0c;测试过程绕过OS自带的buffer&#xff0c;使测试磁盘的结果更真…

olmOCR:高效精准的 PDF 文本提取工具

在日常的工作和学习中&#xff0c;是否经常被 PDF 文本提取问题困扰&#xff1f;例如&#xff1a; 想从学术论文 PDF 中提取关键信息&#xff0c;却发现传统 OCR 工具识别不准确或文本格式混乱&#xff1f;需要快速提取商务合同 PDF 中的条款内容&#xff0c;却因工具不给力而…

Leetcode 刷题记录 06 —— 矩阵

本系列为笔者的 Leetcode 刷题记录&#xff0c;顺序为 Hot 100 题官方顺序&#xff0c;根据标签命名&#xff0c;记录笔者总结的做题思路&#xff0c;附部分代码解释和疑问解答。 目录 01 矩阵置零 方法一&#xff1a;标记数组 方法二&#xff1a;两个标记变量 02 螺旋矩阵…

Elasticsearch:使用 BigQuery 提取数据

作者&#xff1a;来自 Elastic Jeffrey Rengifo 了解如何使用 Python 在 Elasticsearch 中索引和搜索 Google BigQuery 数据。 BigQuery 是 Google 的一个平台&#xff0c;允许你将来自不同来源和服务的数据集中到一个存储库中。它还支持数据分析&#xff0c;并可使用生成式 AI…

如何在el-input搜索框组件的最后面,添加图标按钮?

1、问题描述 2、解决步骤 在el-input组件标签内&#xff0c;添加一个element-plus的自定义插槽&#xff0c; 在插槽里放一个图标按钮即可。 3、效果展示 结语 以上就是在搜索框组件的末尾添加搜索按钮的过程。 喜欢本篇文章的话&#xff0c;请关注本博主~~

Magento2根据图片文件包导入产品图片

图片包给的图片文件是子产品的图片&#xff0c;如下图&#xff1a;A104255是主产品的sku <?php/*** 根据图片包导入产品图片&#xff0c;包含子产品和主产品* 子产品是作为主图&#xff0c;主产品是作为附加图片*/use Magento\Framework\App\Bootstrap;include(../app/boot…

INT_MAX 与 0x3f3f3f3f 的区别

【INT_MAX 与 0x3f3f3f3f 的区别】 在算法设计中&#xff0c;INT_MAX 与 0x3f3f3f3f 都常被用作无穷大值的设定&#xff0c;但二者区别显著&#xff0c;适用场景也有所不同。 备注&#xff1a;此图由百度 AI 创作生成 &#xff08;1&#xff09;INT_MAX 是 C/C 中的标准常量&a…

升级旧版本Vmware到Vmware Workstation Pro 17

背景 一些新版本Linux内核版本较高&#xff0c;例如&#xff1a;openEuler24.03 LTS需要的内核版本为6.6&#xff0c;而Vmware Workstation Pro 16最高只支持Linux5.x内核&#xff0c;对Linux6.x不支持&#xff0c;因此&#xff0c;需要将旧版本的Vmware升级到Vmware Workstat…

【第23节】C++设计模式(行为模式)-Interpreter(解释器)模式

一、问题背景 在一些应用中&#xff0c;系统会提供内建&#xff08;Build-In&#xff09;的脚本或宏语言&#xff0c;允许用户定义他们能够在系统中执行的操作。Interpreter 模式的目的就是为用户提供一种定义语言的语法表示&#xff0c;并通过解释器来解释语言中的句子。这种模…

哈弗赛恩公式计算长度JavaScript实现

哈弗赛恩公式&#xff08;Haversine formula&#xff09;是一种用于计算球面上两点间最短距离的数学方法&#xff0c;尤其适用于地球表面。本文将详细介绍哈弗赛恩公式的原理、应用以及如何使用JavaScript实现它。 一、哈弗赛恩公式原理 在球面几何中&#xff0c;哈弗赛恩公式…

Day05 实例:正向反向连接内外网环境防火墙出入站

一、正反向连接 0、先将防火墙关闭 Linux&#xff1a; sudo systemctl stop firewalld Windows&#xff1a;netsh advfirewall set allprofiles state off 1、正向连接 1.1 Linux连接Windows 00x1 开启两台服务器 并且给Windows拖入nc.exe 00x2 Windows绑定自己5566端…

【大模型知识点】位置编码——绝对位置编码,相对位置编码,旋转位置编码RoPE

由于Transformer 中的自注意模块具有置换不变性&#xff08;不关心输入序列的顺序&#xff09;&#xff0c;因此需要使用位置编码来注入位置信息以建模序列&#xff0c;使模型能够区分不同位置的 token&#xff0c;并捕捉序列的顺序关系。 在介绍一些位置编码方法前&#xff0…

Linux 配置静态 IP

一、简介 在 Linux CentOS 系统中默认动态分配 IP 地址&#xff0c;每次启动虚拟机服务都是不一样的 IP&#xff0c;因此要配置静态 IP 地址避免每次都发生变化&#xff0c;下面将介绍配置静态 IP 的详细步骤。 首先先理解一下动态 IP 和静态 IP 的概念&#xff1a; 动态 IP…

DeepSeek 3FS:端到端无缓存的存储新范式

在 2025 年 2 月 28 日&#xff0c;DeepSeek 正式开源了其高性能分布式文件系统 3FS【1】&#xff0c;作为其开源周的压轴项目&#xff0c;3FS 一经发布便引发了技术圈的热烈讨论。它不仅继承了分布式存储的经典设计&#xff0c;还通过极简却高效的架构&#xff0c;展现了存储技…