最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

node工作線程worker_threads的基本使用

 更新時間:2023年02月01日 10:17:01   作者:在下月亮有何貴干  
本文主要介紹了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ù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • npm的安裝與使用

    npm的安裝與使用

    這篇文章介紹了npm的安裝與使用,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-06-06
  • 詳解nodejs 文本操作模塊-fs模塊(四)

    詳解nodejs 文本操作模塊-fs模塊(四)

    本篇文章詳細的講訴fa.fstat方法,這個State對象中,包含的數(shù)據(jù)都有哪些,并且他們分別代表的含義是什么。具有一定的參考價值,有興趣的可以了解一下。
    2016-12-12
  • Express的HTTP重定向到HTTPS的方法

    Express的HTTP重定向到HTTPS的方法

    本篇文章主要介紹了Express的HTTP重定向到HTTPS的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-06-06
  • adm-zip-0.4.13-中文文檔詳解

    adm-zip-0.4.13-中文文檔詳解

    這篇文章主要介紹了adm-zip-0.4.13-中文文檔,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-05-05
  • package-lock.json解決依賴的版本管理使用詳解

    package-lock.json解決依賴的版本管理使用詳解

    這篇文章主要為大家介紹了package-lock.json解決依賴的版本管理使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-08-08
  • koa-router路由參數(shù)和前端路由的結合詳解

    koa-router路由參數(shù)和前端路由的結合詳解

    這篇文章主要給大家介紹了關于koa-router路由參數(shù)和前端路由的結合的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用koa-router具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-05-05
  • 基于Express+multer實現(xiàn)文件上傳功能

    基于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的項目搭建全過程

    這篇文章主要介紹了Node.js+Express+Vue+MySQL+axios的項目搭建全過程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • node.js中的buffer.Buffer.byteLength方法使用說明

    node.js中的buffer.Buffer.byteLength方法使用說明

    這篇文章主要介紹了node.js中的buffer.Buffer.byteLength方法使用說明,本文介紹了buffer.Buffer.byteLength的方法說明、語法、接收參數(shù)、使用實例和實現(xiàn)源碼,需要的朋友可以參考下
    2014-12-12
  • NodeJS實現(xiàn)圖片文本分割

    NodeJS實現(xiàn)圖片文本分割

    這篇文章主要為大家詳細介紹了NodeJS實現(xiàn)圖片文本分割,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09

最新評論

洞口县| 定远县| 米脂县| 溧水县| 邢台市| 墨脱县| 常宁市| 阿鲁科尔沁旗| 上饶县| 鄂托克旗| 大竹县| 锡林浩特市| 白河县| 溧水县| 舞钢市| 喀喇沁旗| 荆州市| 榕江县| 屯留县| 靖安县| 封开县| 定远县| 汝州市| 湘潭县| 林州市| 武鸣县| 河池市| 嘉定区| 昌图县| 海门市| 图们市| 南城县| 姜堰市| 抚顺市| 黔南| 昌江| 平安县| 名山县| 宜春市| 锡林郭勒盟| 阿拉善左旗|