node工作线程worker_threads的基本使用

 更新时间:2023年02月01日 10:17:01   作者:在下月亮有何贵干  
本文主要介绍了node工作线程worker_threads的基本使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

前言

nodejs从第十版开始,支持了真正的多线程编程,今天我们就来学习一下worker_threads工作线程的一些基本使用方法。

主线程与工作线程

我们做一个特别简单的例子,主线程给工作线程提供参数,工作线程负责简单的加法计算(实际场景可以是很复杂的计算),计算完毕返回给主线程。

运行主线程即可得到执行结果。

主线程(main.js)

  • 引入工作线程构造函数Worker传入work.js的文件地址创建工作线程work。
  • 工作线程work可以通过postMessage传递数据,这里传递了一个对象过去。
  • 工作线程work可以通过监听message方法获得工作线程传来的数据。
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方法可以获取主线程传来的数据,与work.postMessage相对应,传来的数据在event.data中,event还有一些其他参数。
  • parentPort.postMessage方法可以传递数据去主线程,与work的监听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,它可以提供两个可以互相传递数据的端口。

下面的例子简单演示了端口1向端口2传递数据,一个传递数据一个接收数据。

反之也一样的,端口2向端口1传递数据也是同样的方法。

import {MessageChannel} from 'worker_threads'

const {port1, port2} = new MessageChannel()

port1.postMessage('123')

port2.onmessage = ev => {
    console.log(ev.data) 
}

那我们怎么利用MessageChannel来进行工作线程间的交互呢?

只要分别将两个端口传去对应的工作线程不就好了吗?

  • 传递端口不可以简单的使用postMessage的第一个数据入参传递,只能通过第二个参数并且以数组的形式传递。
  • 我们在传送对象数据中加入参数type,type为port用告诉工作线程我们传递的是端口,需要进行端口的监听操作。
  • 同时我们传递type为send的数据,负责端口的发送数据操作。
  • 两边既有监听又有发送,即实现了通信。

主线程(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创建好port1的监听事件,随时可以接收到port2传来的数据。
同时我们在额外创建一个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
    }
} 

尾言

内容并不多,主要是nodejs中需要用到工作线程的实际可用场景并不多,将来若有机会还会继续补充。

到此这篇关于node工作线程worker_threads的基本使用的文章就介绍到这了,更多相关node工作线程worker_threads内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • npm 语义版本控制详解

    npm 语义版本控制详解

    这篇文章主要介绍了npm 语义版本控制详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • nodejs微信扫码支付功能实现

    nodejs微信扫码支付功能实现

    本片文章通过代码示例给大家详细讲述了如何用nodejs写出微信扫码支付这个功能,有兴趣的朋友可以参考下。
    2018-02-02
  • Node.js中的require.resolve方法使用简介

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

    在Node.js中,可以使用require.resolve函数来查询某个模块文件的带有完整绝对路径的文件名,下面这篇文章主要介绍了Node.js中require.resolve方法使用的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-04-04
  • nodejs 实现简单的文件上传功能(示例详解)

    nodejs 实现简单的文件上传功能(示例详解)

    这篇文章主要介绍了nodejs 实现简单的文件上传功能,文件上传方式分为三种,本文通过实例代码给大家详细介绍,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-02-02
  • node.js中npm包管理工具用法分析

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

    这篇文章主要介绍了node.js中npm包管理工具用法,结合实例形式分析了node.js中npm包管理工具查看、安装、更新、卸载等相关操作技巧与注意事项,需要的朋友可以参考下
    2020-02-02
  • Node.js和Vue的安装与配置超详细步骤(推荐)

    Node.js和Vue的安装与配置超详细步骤(推荐)

    使用VUE前端框架开发,需要安装Node.js和Vue.js,这篇文章主要给大家介绍了关于Node.js和Vue的安装与配置超详细步骤的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2024-01-01
  • node.js中的fs.lchown方法使用说明

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

    这篇文章主要介绍了node.js中的fs.lchown方法使用说明,本文介绍了fs.lchown的方法说明、语法、接收参数、使用实例和实现源码,需要的朋友可以参考下
    2014-12-12
  • 分析node事件循环和消息队列

    分析node事件循环和消息队列

    node的好处毋庸置疑,事件驱动,异步非阻塞I/O,以及处理高并发的能力深入人心,因此大家喜欢用node做一些小型后台服务或者作为中间层和其他服务配合完成一些大型应用场景。
    2021-06-06
  • Node.js学习之TCP/IP数据通讯(实例讲解)

    Node.js学习之TCP/IP数据通讯(实例讲解)

    下面小编就为大家带来一篇Node.js学习之TCP/IP数据通讯(实例讲解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • node.js中的url.parse方法使用举例

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

    url.parse()可以将一个完整的URL地址,分为很多部分,下面这篇文章主要给大家介绍了关于node.js中url.parse方法使用的相关资料,文中通过实例代码和图文介绍的非常详细,需要的朋友可以参考下
    2023-03-03

最新评论