日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

关于 NODE.js 并行线程 worker_threads 的使用与详解。

發布時間:2025/3/12 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于 NODE.js 并行线程 worker_threads 的使用与详解。 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

javascript 是單線程,那么node.js屬于服務端語言改如何實現其他語言中的并發線程執行呢?在node V10只有 child_process,cluster的API來開啟多子進程,多進程。進程并不是子線程,無法內存共享。在nodeV10后引入worker_threads API概念。

worker_threads

node官方文檔注明了:

  • worker_threads 模塊允許使用并行地執行 JavaScript 的線程。
  • 與 child_process 或 cluster 不同, worker_threads 可以共享內存。 它們通過傳輸 ArrayBuffer 實例或共享 SharedArrayBuffer 實例來實現。

所以我們看到worker_threads作用類似其他語言中的子線程并發執行,首先我們執行兩段代碼使用worker_threads和不使用worker_threads的區別。

模擬一個cpu密集計算 http 服務

const http = require('http')const fork = () => {const startTime = new Date().getTime()for(let i = 0; i < 1000000000; i ++) {}const endTime = new Date().getTime()return `運算1000000000次,開始運算時間:${startTime},結束運算時間${endTime}` }const server = http.createServer((request, response) => {if(request.url === '/') {const result1 = fork() // 運算第一次const result2 = fork() // 運算第二次response.setHeader('content-Type', 'text/html; charset=utf-8')response.statusCode = 200response.end(`${result1} \n ${result2}`, 'utf-8')} })server.listen(8080, () => {console.log('啟動成功') })
然后我們打開瀏覽器訪問 http://localhost:8080/

我們可以看到運算結果是依次進行的。那么我們來使用worker_threads進行優化看看結果

把程序中的密集計算工作提煉到另一個worker.js文中,因為worker_threads是以js文件來運行的。

// worker.js const { parentPort } = require('worker_threads')const startTime = new Date().getTime() for(let i = 0; i < 1000000000; i ++) {} const endTime = new Date().getTime()parentPort.postMessage(`運算1000000000次,開始運算時間:${startTime},結束運算時間${endTime}`) // http.js 修改 const http = require('http') const { join } = require('path') const { Worker } = require('worker_threads')const server = http.createServer((request, response) => {if(request.url === '/') {response.setHeader('content-Type', 'text/html; charset=utf-8')response.statusCode = 200const wk1 = new Worker(join(__dirname, './worker.js'))const wk2 = new Worker(join(__dirname, './worker.js'))let result = ''const success = res => {if (result) // 判斷是否已經接收到一次結果response.end(`${result} <br /> ${res}`, 'utf-8')elseresult = res}wk1.on('message', success)wk2.on('message', success)} })server.listen(8080, () => {console.log('啟動成功') })

訪問http://localhost:8080/ 響應

從響應結果我們可以看到,兩次運算都是并發執行的。上面parentPort API進行父級通信的api。具體更多api和使用大家可以到node官網進行了解

總結

以上是生活随笔為你收集整理的关于 NODE.js 并行线程 worker_threads 的使用与详解。的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。