node工作線程worker_threads的基本使用
前言
nodejs從第十版開始,支持了真正的多線程編程,今天我們就來學習一下worker_threads工作線程的一些基本使用方法。
主線程與工作線程
我們做一個特別簡單的例子,主線程給工作線程提供參數(shù),工作線程負責簡單的加法計算(實際場景可以是很復雜的計算),計算完畢返回給主線程。
運行主線程即可得到執(zhí)行結果。
主線程(main.js)
- 引入工作線程構造函數(shù)Worker傳入work.js的文件地址創(chuàng)建工作線程work。
- 工作線程work可以通過postMessage傳遞數(shù)據(jù),這里傳遞了一個對象過去。
- 工作線程work可以通過監(jiān)聽message方法獲得工作線程傳來的數(shù)據(jù)。
import {Worker} from 'worker_threads'
const work = new Worker('./work.js')?
work.postMessage({x: 1, y: 2})
work.on('message', value => {
? ? console.log(value)
})工作線程(work.js)
- 引入parentPort可以與主線程(引入了該工作線程的線程)進行交互。
- parentPort.onmessage方法可以獲取主線程傳來的數(shù)據(jù),與work.postMessage相對應,傳來的數(shù)據(jù)在event.data中,event還有一些其他參數(shù)。
- parentPort.postMessage方法可以傳遞數(shù)據(jù)去主線程,與work的監(jiān)聽message方法相對應
import {parentPort} from 'worker_threads'
const getSum = (x, y) => {
? ? return x + y ?
}
parentPort.onmessage = (event) => {
? ? const {x, y} = event.data
? ? const res = getSum(x, y)
? ? parentPort.postMessage(res)
}工作線程交互
假如我們需要兩個工作線程之間進行交互,需要依賴主線程搭建橋梁。
至于搭建橋梁的工具,則是依賴中的MessageChannel,它可以提供兩個可以互相傳遞數(shù)據(jù)的端口。
下面的例子簡單演示了端口1向端口2傳遞數(shù)據(jù),一個傳遞數(shù)據(jù)一個接收數(shù)據(jù)。
反之也一樣的,端口2向端口1傳遞數(shù)據(jù)也是同樣的方法。
import {MessageChannel} from 'worker_threads'
const {port1, port2} = new MessageChannel()
port1.postMessage('123')
port2.onmessage = ev => {
? ? console.log(ev.data)?
}那我們怎么利用MessageChannel來進行工作線程間的交互呢?
只要分別將兩個端口傳去對應的工作線程不就好了嗎?
- 傳遞端口不可以簡單的使用postMessage的第一個數(shù)據(jù)入?yún)鬟f,只能通過第二個參數(shù)并且以數(shù)組的形式傳遞。
- 我們在傳送對象數(shù)據(jù)中加入?yún)?shù)type,type為port用告訴工作線程我們傳遞的是端口,需要進行端口的監(jiān)聽操作。
- 同時我們傳遞type為send的數(shù)據(jù),負責端口的發(fā)送數(shù)據(jù)操作。
- 兩邊既有監(jiān)聽又有發(fā)送,即實現(xiàn)了通信。
主線程(main.js)
import {Worker, MessageChannel} from 'worker_threads'
let work1 = new Worker('./work1.js')
let work2 = new Worker('./work2.js')
const {port1, port2} = new MessageChannel()
work1.postMessage({type: 'port'}, [port1])
work2.postMessage({type: 'port'}, [port2])
work1.postMessage({type: 'send', value: '從線程1向線程2傳遞信息'})
work2.postMessage({type: 'send', value: '從線程2向線程1傳遞信息'})工作線程1(work1.js)從主線程傳來的port可以通過event.ports[0]得到,我們在工作線程1創(chuàng)建好port1的監(jiān)聽事件,隨時可以接收到port2傳來的數(shù)據(jù)。
同時我們在額外創(chuàng)建一個send類型事件,就可以在主線程,控制兩個工作線程之間傳遞消息了。
import {parentPort} from 'worker_threads'
let port1
parentPort.onmessage = (event) => {
? ? const {type, value} = event.data
? ? switch (type) {
? ? ? ? case 'port':
? ? ? ? ? ? port1 = event.ports[0]
? ? ? ? ? ? port1.onmessage = ev => {
? ? ? ? ? ? ? ? console.log(ev.data)?
? ? ? ? ? ? }
? ? ? ? ? ? break
? ? ? ? case 'send':
? ? ? ? ? ? port1.postMessage(value)
? ? ? ? ? ? break
? ? ? ? default:
? ? ? ? ? ? break
? ? }
}工作線程2(work2.js)
與工作線程1同理。
import {parentPort} from "worker_threads";
let port2
parentPort.onmessage = (event) => {
? ? const {type, value} = event.data
? ? switch (type) {
? ? ? ? case 'port':
? ? ? ? ? ? port2 = event.ports[0]
? ? ? ? ? ? port2.onmessage = ev => {
? ? ? ? ? ? ? ? console.log(ev.data)
? ? ? ? ? ? }
? ? ? ? ? ? break
? ? ? ? case 'send':
? ? ? ? ? ? port2.postMessage(value)
? ? ? ? ? ? break
? ? ? ? default:
? ? ? ? ? ? break
? ? }
}?尾言
內(nèi)容并不多,主要是nodejs中需要用到工作線程的實際可用場景并不多,將來若有機會還會繼續(xù)補充。
到此這篇關于node工作線程worker_threads的基本使用的文章就介紹到這了,更多相關node工作線程worker_threads內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
package-lock.json解決依賴的版本管理使用詳解
這篇文章主要為大家介紹了package-lock.json解決依賴的版本管理使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-08-08
基于Express+multer實現(xiàn)文件上傳功能
Multer是Node.js中的一個第三方包,或者說是第三方中間件,主要用于是實現(xiàn)文件上傳的功能,本文小編講給大家詳細介紹一下基于Express+multer來實現(xiàn)文件上傳功能,文章通過代碼示例和圖文介紹的非常詳細,需要的朋友可以參考下2023-11-11
Node.js+Express+Vue+MySQL+axios的項目搭建全過程
這篇文章主要介紹了Node.js+Express+Vue+MySQL+axios的項目搭建全過程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-12-12
node.js中的buffer.Buffer.byteLength方法使用說明
這篇文章主要介紹了node.js中的buffer.Buffer.byteLength方法使用說明,本文介紹了buffer.Buffer.byteLength的方法說明、語法、接收參數(shù)、使用實例和實現(xiàn)源碼,需要的朋友可以參考下2014-12-12

