精品秘无码一区二区三区老师-精品秘一区二三区免费雷安-精品蜜桃秘一区二区三区-精品蜜桃秘一区二区三区粉嫩-精品蜜桃一区二区三区-精品蜜臀国产aⅴ一区二区三区

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

TypeScript 中的并發與并行有什么區別?

admin
2024年12月29日 8:18 本文熱度 258

現代應用程序要求高性能和響應性,這要求開發者掌握并發和并行。TypeScript 作為 JavaScript 的超集,提供了強大的工具和模式來管理這些復雜性。本指南從各個角度探討這兩個概念,深入實際示例、模式和高級實踐,以利用 TypeScript 中的并發和并行。

并發與并行:關鍵區別

在深入代碼之前,理解這些術語至關重要:

1.并發

  • 定義:系統通過交錯執行多個任務的能力(不一定是同時進行)。
  • 示例:在事件循環中切換處理數據庫查詢和文件上傳。

2.并行

  • 定義:通過利用多核處理器同時執行多個任務。
  • 示例:在不同的核心上同時進行復雜的數學計算。

可視化

想象一個餐廳:

  • 并發:一個廚師在多個菜肴之間多任務處理。
  • 并行:多個廚師同時處理不同的菜肴。

TypeScript 中的并發

JavaScript,以及擴展的 TypeScript,運行在單線程事件循環上,這可能使得并發聽起來不可能實現。然而,通過異步編程模型如回調、承諾async/await實現了并發。

1. 使用 Promise 實現并發

Promises 是在 TypeScript 中實現并發的最簡單方式之一。

const fetchData = (url: string) => {
returnnewPromise<string>((resolve) => {
    setTimeout(() => resolve(`Data from ${url}`), 1000);
  });
};

const main = async () => {
console.log('Fetching data concurrently...');
const data1 = fetchData('https://api.example.com/1');
const data2 = fetchData('https://api.example.com/2');

const results = awaitPromise.all([data1, data2]);
console.log(results); // ["Data from https://api.example.com/1",  "Data from https://api.example.com/2"]
};
main();

解釋

Promise.all 允許兩個獲取操作并發運行,節省時間。

2. 使用 Async/Await 實現并發

async/await 在保持異步特性的同時簡化了 promise 鏈。

async function task1({
console.log("Task 1 started");
awaitnewPromise((resolve) => setTimeout(resolve, 2000));
console.log("Task 1 completed");
}

asyncfunction task2({
console.log("Task 2 started");
awaitnewPromise((resolve) => setTimeout(resolve, 1000));
console.log("Task 2 completed");
}

asyncfunction main({
console.log("Concurrent execution...");
awaitPromise.all([task1(), task2()]);
console.log("All tasks completed");
}
main();

TypeScript 中的并行

雖然 JavaScript 本身不支持多線程,但 Web Workers 和 Node.js Worker Threads 啟用了并行。這些特性利用單獨的線程來處理計算密集型任務。

1. Web Workers 實現并行

在瀏覽器環境中,Web Workers 在單獨的線程中執行腳本。

// worker.ts
addEventListener('message', (event) => {
  const result = event.data.map((num: number) => num * 2);
  postMessage(result);
});
// main.ts
const worker = new Worker('worker.js');

worker.onmessage = (event) => {
  console.log('Result from worker:', event.data);
};

worker.postMessage([1234]);

2. Node.js Worker Threads 實現并行

對于服務器端應用程序,Node.js 提供了worker_threads

// worker.js
const { parentPort } = require('worker_threads');
parentPort.on('message', (data) => {
  const result = data.map((num) => num * 2);
  parentPort.postMessage(result);
});
// main.js
const { Worker } = require('worker_threads');

const worker = new Worker('./worker.js');
worker.on('message', (result) => {
  console.log('Worker result:', result);
});
worker.postMessage([1234]);

有效并發與并行的模式

1. 任務隊列管理并發

在處理許多任務時,任務隊列確保受控執行。

class TaskQueue {
  private queue: (() =>Promise<void>)[] = [];
  private running = 0;
constructor(private concurrencyLimit: number) {}

  enqueue(task: () =>Promise<void>) {
    this.queue.push(task);
    this.run();
  }

  private async run() {
    if (this.running >= this.concurrencyLimit || this.queue.length === 0return;

    this.running++;
    const task = this.queue.shift();
    if (task) await task();
    this.running--;
    this.run();
  }
}

// 使用
const queue = new TaskQueue(3);
for (let i = 0; i < 10; i++) {
  queue.enqueue(async () => {
    console.log(`Task ${i} started`);
    awaitnewPromise((resolve) => setTimeout(resolve, 1000));
    console.log(`Task ${i} completed`);
  });
}

2. 使用工作池進行負載均衡

工作池高效地在多個工作線程之間分配任務。

import { Worker, isMainThread, parentPort, workerData } from'worker_threads';

if (isMainThread) {
const workers = Array.from({ length4 }, () => new Worker(__filename));
const tasks = [10203040];
  workers.forEach((worker, index) => {
    worker.postMessage(tasks[index]);
    worker.on('message', (result) => console.log('Result:', result));
  });
else {
  parentPort.on('message', (task) => {
    parentPort.postMessage(task * 2);
  });
}

挑戰與解決方案

  1. 調試異步代碼
    • 使用 Node.js 中的 async_hooks 等工具來追蹤異步操作。
    • 使用支持調試 async/await 代碼的 IDE。
  2. 錯誤處理
    • 將 promise 包裝在 try/catch 塊中,或與 Promise.all 一起使用 .catch()。
  3. 競態條件
    • 避免共享狀態或使用鎖定機制。

并發與并行的最佳實踐

  1. 優先考慮異步 I/O:避免在 I/O 密集型操作中阻塞主線程。
  2. 為 CPU 密集型任務使用工作線程:將重計算卸載到工作線程或 Web Workers。
  3. 限制并發:使用任務隊列或 p-limit 等庫來控制并發級別。
  4. 利用庫:使用 Bull 等庫進行任務隊列管理,或使用 Workerpool 進行工作線程管理。

結論

并發和并行對于構建高性能、可擴展的 TypeScript 應用程序至關重要。并發通過交錯任務提高響應性,而并行則在多核系統上實現同時執行。通過掌握這些概念,開發者可以應對現代應用程序中的挑戰,并提供無縫的用戶體驗。


?原文地址:https://dev.to/shafayeat/mastering-concurrency-and-parallelism-in-typescript-1bgf


該文章在 2024/12/30 12:41:54 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業的專業生產管理軟件系統,系統成熟度和易用性得到了國內大量中小企業的青睞。
點晴PMS碼頭管理系統主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業務管理,結合碼頭的業務特點,圍繞調度、堆場作業而開發的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業的高效ERP管理信息系統。
點晴WMS倉儲管理系統提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統,標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協同辦公管理系統。
Copyright 2010-2025 ClickSun All Rights Reserved

主站蜘蛛池模板: 人妻少妇免费视频一区二区 | 久久综合AV中文无码 | 欧美黑人又粗又硬xxxxx喷水 | 亚洲综合久久精品无码色 | 精品无码av无| 色-情-伦-理一区二区三区 | 亚洲国产成人精品女人久久 | 国产精品无码dvd在线观看 | 无码爆乳超乳中文字幕在线 | 欧美日韩无线码免费播放器 | 无码中文字幕人妻在线一区 | 无码又爽又刺激A片涩涩动漫软件 | 国产在线拍揄自揄 | 国农村精品国产自线拍 | 国产初高中生在线视频 | 韩国三级日本三级香港黄 | 偷拍激情视频一区 | 亚洲av综合永久无码精品天堂 | 麻豆精品人妻一区二区三区蜜桃 | 欧美日韩精品在线二区 | 精品国产午夜福利在线观看 | 国产真实乱对白精彩久久老熟妇女 | 亚洲av无码专区一区二区三区 | 一区二区亚洲精品国产精华液 | 亚洲精品国产一区二区贰佰信息网 | 亚洲一区二区三区在线网站电影 | 无码av中文一区二区 | 亚洲av无码成人精品区日韩 | 日日噜狠狠噜天天噜av | 亚洲精品国产精品国自产网站 | 9传媒制片厂制作免费入口 9国产露脸精品国产麻豆 | 中文字幕久精品视频在线观看 | 国模冰莲自慰肥美胞极品人体图 | 中文字幕无码日韩欧免费软件 | 蜜臀av在线播放一区二区三区 | 精品福利一区二区三区免费视频 | 亚洲va中文字幕无码毛片 | 国产午夜亚洲精品午夜鲁丝片 | 亚洲熟女乱综合一区二区三区 | 欧美高清视频www夜色资源网 | 国产女人水真多18毛片18精品 |