node工作線程worker_threads的基本使用
前言
nodejs從第十版開始,支持了真正的多線程編程,今天我們就來學(xué)習(xí)一下worker_threads工作線程的一些基本使用方法。
主線程與工作線程
我們做一個(gè)特別簡(jiǎn)單的例子,主線程給工作線程提供參數(shù),工作線程負(fù)責(zé)簡(jiǎn)單的加法計(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ù)的端口。
下面的例子簡(jiǎn)單演示了端口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)的工作線程不就好了嗎?
- 傳遞端口不可以簡(jiǎn)單的使用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)文章
Node.js中的require.resolve方法使用簡(jiǎn)介
在Node.js中,可以使用require.resolve函數(shù)來查詢某個(gè)模塊文件的帶有完整絕對(duì)路徑的文件名,下面這篇文章主要介紹了Node.js中require.resolve方法使用的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧。2017-04-04
nodejs?實(shí)現(xiàn)簡(jiǎn)單的文件上傳功能(示例詳解)
這篇文章主要介紹了nodejs?實(shí)現(xiàn)簡(jiǎn)單的文件上傳功能,文件上傳方式分為三種,本文通過實(shí)例代碼給大家詳細(xì)介紹,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-02-02
Node.js和Vue的安裝與配置超詳細(xì)步驟(推薦)
使用VUE前端框架開發(fā),需要安裝Node.js和Vue.js,這篇文章主要給大家介紹了關(guān)于Node.js和Vue的安裝與配置超詳細(xì)步驟的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2024-01-01
Node.js學(xué)習(xí)之TCP/IP數(shù)據(jù)通訊(實(shí)例講解)
下面小編就為大家?guī)硪黄狽ode.js學(xué)習(xí)之TCP/IP數(shù)據(jù)通訊(實(shí)例講解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-10-10

