node工作線程worker_threads的基本使用
前言
nodejs從第十版開始,支持了真正的多線程編程,今天我們就來學(xué)習(xí)一下worker_threads工作線程的一些基本使用方法。
主線程與工作線程
我們做一個(gè)特別簡單的例子,主線程給工作線程提供參數(shù),工作線程負(fù)責(zé)簡單的加法計(jì)算(實(shí)際場景可以是很復(fù)雜的計(jì)算),計(jì)算完畢返回給主線程。
運(yùn)行主線程即可得到執(zhí)行結(jié)果。
主線程(main.js)
- 引入工作線程構(gòu)造函數(shù)Worker傳入work.js的文件地址創(chuàng)建工作線程work。
- 工作線程work可以通過postMessage傳遞數(shù)據(jù),這里傳遞了一個(gè)對象過去。
- 工作線程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相對應(yīng),傳來的數(shù)據(jù)在event.data中,event還有一些其他參數(shù)。
- parentPort.postMessage方法可以傳遞數(shù)據(jù)去主線程,與work的監(jiān)聽message方法相對應(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)? }
那我們怎么利用MessageChannel來進(jìn)行工作線程間的交互呢?
只要分別將兩個(gè)端口傳去對應(yīng)的工作線程不就好了嗎?
- 傳遞端口不可以簡單的使用postMessage的第一個(gè)數(shù)據(jù)入?yún)鬟f,只能通過第二個(gè)參數(shù)并且以數(shù)組的形式傳遞。
- 我們在傳送對象數(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]得到,我們在工作線程1創(chuàng)建好port1的監(jiān)聽事件,隨時(shí)可以接收到port2傳來的數(shù)據(jù)。
同時(shí)我們在額外創(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í)際可用場景并不多,將來若有機(jī)會(huì)還會(huì)繼續(xù)補(bǔ)充。
到此這篇關(guān)于node工作線程worker_threads的基本使用的文章就介紹到這了,更多相關(guān)node工作線程worker_threads內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Node.js中的require.resolve方法使用簡介
在Node.js中,可以使用require.resolve函數(shù)來查詢某個(gè)模塊文件的帶有完整絕對路徑的文件名,下面這篇文章主要介紹了Node.js中require.resolve方法使用的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧。2017-04-04nodejs?實(shí)現(xiàn)簡單的文件上傳功能(示例詳解)
這篇文章主要介紹了nodejs?實(shí)現(xiàn)簡單的文件上傳功能,文件上傳方式分為三種,本文通過實(shí)例代碼給大家詳細(xì)介紹,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-02-02Node.js和Vue的安裝與配置超詳細(xì)步驟(推薦)
使用VUE前端框架開發(fā),需要安裝Node.js和Vue.js,這篇文章主要給大家介紹了關(guān)于Node.js和Vue的安裝與配置超詳細(xì)步驟的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2024-01-01Node.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