欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

node工作線程worker_threads的基本使用

 更新時(shí)間:2023年02月01日 10:17:01   作者:在下月亮有何貴干  
本文主要介紹了node工作線程worker_threads的基本使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

前言

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)文章

  • npm 語義版本控制詳解

    npm 語義版本控制詳解

    這篇文章主要介紹了npm 語義版本控制詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • nodejs微信掃碼支付功能實(shí)現(xiàn)

    nodejs微信掃碼支付功能實(shí)現(xiàn)

    本片文章通過代碼示例給大家詳細(xì)講述了如何用nodejs寫出微信掃碼支付這個(gè)功能,有興趣的朋友可以參考下。
    2018-02-02
  • Node.js中的require.resolve方法使用簡介

    Node.js中的require.resolve方法使用簡介

    在Node.js中,可以使用require.resolve函數(shù)來查詢某個(gè)模塊文件的帶有完整絕對路徑的文件名,下面這篇文章主要介紹了Node.js中require.resolve方法使用的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-04-04
  • nodejs?實(shí)現(xiàn)簡單的文件上傳功能(示例詳解)

    nodejs?實(shí)現(xiàn)簡單的文件上傳功能(示例詳解)

    這篇文章主要介紹了nodejs?實(shí)現(xiàn)簡單的文件上傳功能,文件上傳方式分為三種,本文通過實(shí)例代碼給大家詳細(xì)介紹,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-02-02
  • node.js中npm包管理工具用法分析

    node.js中npm包管理工具用法分析

    這篇文章主要介紹了node.js中npm包管理工具用法,結(jié)合實(shí)例形式分析了node.js中npm包管理工具查看、安裝、更新、卸載等相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下
    2020-02-02
  • Node.js和Vue的安裝與配置超詳細(xì)步驟(推薦)

    Node.js和Vue的安裝與配置超詳細(xì)步驟(推薦)

    使用VUE前端框架開發(fā),需要安裝Node.js和Vue.js,這篇文章主要給大家介紹了關(guān)于Node.js和Vue的安裝與配置超詳細(xì)步驟的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2024-01-01
  • node.js中的fs.lchown方法使用說明

    node.js中的fs.lchown方法使用說明

    這篇文章主要介紹了node.js中的fs.lchown方法使用說明,本文介紹了fs.lchown的方法說明、語法、接收參數(shù)、使用實(shí)例和實(shí)現(xiàn)源碼,需要的朋友可以參考下
    2014-12-12
  • 分析node事件循環(huán)和消息隊(duì)列

    分析node事件循環(huán)和消息隊(duì)列

    node的好處毋庸置疑,事件驅(qū)動(dòng),異步非阻塞I/O,以及處理高并發(fā)的能力深入人心,因此大家喜歡用node做一些小型后臺(tái)服務(wù)或者作為中間層和其他服務(wù)配合完成一些大型應(yīng)用場景。
    2021-06-06
  • Node.js學(xué)習(xí)之TCP/IP數(shù)據(jù)通訊(實(shí)例講解)

    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
  • node.js中的url.parse方法使用舉例

    node.js中的url.parse方法使用舉例

    url.parse()可以將一個(gè)完整的URL地址,分為很多部分,下面這篇文章主要給大家介紹了關(guān)于node.js中url.parse方法使用的相關(guān)資料,文中通過實(shí)例代碼和圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-03-03

最新評論