node工作線程worker_threads的基本使用
前言
nodejs從第十版開始,支持了真正的多線程編程,今天我們就來學(xué)習(xí)一下worker_threads工作線程的一些基本使用方法。
主線程與工作線程
我們做一個(gè)特別簡單的例子,主線程給工作線程提供參數(shù),工作線程負(fù)責(zé)簡單的加法計(jì)算(實(shí)際場(chǎng)景可以是很復(fù)雜的計(jì)算),計(jì)算完畢返回給主線程。
運(yùn)行主線程即可得到執(zhí)行結(jié)果。
主線程(main.js)
- 引入工作線程構(gòu)造函數(shù)Worker傳入work.js的文件地址創(chuàng)建工作線程work。
- 工作線程work可以通過postMessage傳遞數(shù)據(jù),這里傳遞了一個(gè)對(duì)象過去。
- 工作線程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可以與主線程(引入了該工作線程的線程)進(jìn)行交互。
- parentPort.onmessage方法可以獲取主線程傳來的數(shù)據(jù),與work.postMessage相對(duì)應(yīng),傳來的數(shù)據(jù)在event.data中,event還有一些其他參數(shù)。
- parentPort.postMessage方法可以傳遞數(shù)據(jù)去主線程,與work的監(jiān)聽message方法相對(duì)應(yīng)
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)
}工作線程交互
假如我們需要兩個(gè)工作線程之間進(jìn)行交互,需要依賴主線程搭建橋梁。
至于搭建橋梁的工具,則是依賴中的MessageChannel,它可以提供兩個(gè)可以互相傳遞數(shù)據(jù)的端口。
下面的例子簡單演示了端口1向端口2傳遞數(shù)據(jù),一個(gè)傳遞數(shù)據(jù)一個(gè)接收數(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)?
}那我們?cè)趺蠢肕essageChannel來進(jìn)行工作線程間的交互呢?
只要分別將兩個(gè)端口傳去對(duì)應(yīng)的工作線程不就好了嗎?
- 傳遞端口不可以簡單的使用postMessage的第一個(gè)數(shù)據(jù)入?yún)鬟f,只能通過第二個(gè)參數(shù)并且以數(shù)組的形式傳遞。
- 我們?cè)趥魉蛯?duì)象數(shù)據(jù)中加入?yún)?shù)type,type為port用告訴工作線程我們傳遞的是端口,需要進(jìn)行端口的監(jiān)聽操作。
- 同時(shí)我們傳遞type為send的數(shù)據(jù),負(fù)責(zé)端口的發(fā)送數(shù)據(jù)操作。
- 兩邊既有監(jiān)聽又有發(fā)送,即實(shí)現(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]得到,我們?cè)诠ぷ骶€程1創(chuàng)建好port1的監(jiān)聽事件,隨時(shí)可以接收到port2傳來的數(shù)據(jù)。
同時(shí)我們?cè)陬~外創(chuàng)建一個(gè)send類型事件,就可以在主線程,控制兩個(gè)工作線程之間傳遞消息了。
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中需要用到工作線程的實(shí)際可用場(chǎng)景并不多,將來若有機(jī)會(huì)還會(huì)繼續(xù)補(bǔ)充。
到此這篇關(guān)于node工作線程worker_threads的基本使用的文章就介紹到這了,更多相關(guān)node工作線程worker_threads內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
package-lock.json解決依賴的版本管理使用詳解
這篇文章主要為大家介紹了package-lock.json解決依賴的版本管理使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08
koa-router路由參數(shù)和前端路由的結(jié)合詳解
這篇文章主要給大家介紹了關(guān)于koa-router路由參數(shù)和前端路由的結(jié)合的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用koa-router具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05
基于Express+multer實(shí)現(xiàn)文件上傳功能
Multer是Node.js中的一個(gè)第三方包,或者說是第三方中間件,主要用于是實(shí)現(xiàn)文件上傳的功能,本文小編講給大家詳細(xì)介紹一下基于Express+multer來實(shí)現(xiàn)文件上傳功能,文章通過代碼示例和圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-11-11
Node.js+Express+Vue+MySQL+axios的項(xiàng)目搭建全過程
這篇文章主要介紹了Node.js+Express+Vue+MySQL+axios的項(xiàng)目搭建全過程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12
node.js中的buffer.Buffer.byteLength方法使用說明
這篇文章主要介紹了node.js中的buffer.Buffer.byteLength方法使用說明,本文介紹了buffer.Buffer.byteLength的方法說明、語法、接收參數(shù)、使用實(shí)例和實(shí)現(xiàn)源碼,需要的朋友可以參考下2014-12-12

