返回顶部
首页 > 资讯 > 前端开发 > JavaScript >node工作线程worker_threads的基本使用
  • 528
分享到

node工作线程worker_threads的基本使用

node工作线程worker_threadsnode工作线程node worker_threads 2023-02-01 12:02:17 528人浏览 泡泡鱼
摘要

目录前言主线程与工作线程工作线程交互尾言前言 nodejs从第十版开始,支持了真正的多线程编程,今天我们就来学习一下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内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: node工作线程worker_threads的基本使用

本文链接: https://lsjlt.com/news/193810.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • node工作线程worker_threads的基本使用
    目录前言主线程与工作线程工作线程交互尾言前言 nodejs从第十版开始,支持了真正的多线程编程,今天我们就来学习一下worker_threads工作线程的一些基本使用方法。 主线程与...
    99+
    2023-02-01
    node工作线程worker_threads node工作线程 node worker_threads
  • Node.js如何使用worker_threads多线程进行并行处理
    这篇文章给大家分享的是有关Node.js如何使用worker_threads多线程进行并行处理的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。很多人似乎都无法理解单线程 NodeJ...
    99+
    2024-04-02
  • java中多线程与线程池的基本使用方法
    目录前言继承Thread 实现Runnale接口Callable线程池常见的4种线程池。总结前言 在java中,如果每个请求到达就创建一个新线程,开销是相当大的。在实际使用中,服务器...
    99+
    2024-04-02
  • hutool 工具类基本使用教程
    在之前没有接触到这个工具类的时候,感觉自己好像根本就不知道这个的存在,再次之前没有一个完善的知识体系,但是在发现这个工具类之后,才真的发现这个工具类是真的好用,下面我就简单的介绍一下...
    99+
    2024-04-02
  • LOB的基本操作和工作
    LOB(即大型对象)是数据库管理系统 (DBMS) 中的一种数据类型,用于存储大量非结构化数据,例如文本、图像和视频。 LOB 数据类型对于存储和操作不适合传统行列结构的数据非常有用,例如文档、图形或音频文件。 在本文中,我们将探讨DBMS...
    99+
    2023-10-22
  • 基于node的cli工具开发使用详解
    目录前言背景功能特性效果预览插件开发使用实现原理使用到的工具package.jsonweb-cli.tsservice.tscreate.ts前言 如果文章对你有帮助的话,记得一键...
    99+
    2023-05-13
    node cli开发工具 node cli
  • 基于node的cli工具怎么开发使用
    本篇内容介绍了“基于node的cli工具怎么开发使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!背景公司内部有维护admin和h6两套基础...
    99+
    2023-07-05
  • 如何使用工具切换node版本
    这篇文章主要讲解了“如何使用工具切换node版本”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何使用工具切换node版本”吧!之前都没有接触过需要切换 n...
    99+
    2024-04-02
  • Java中线程的基本方法使用技巧
    java中线程的基本方法的熟练使用是精通多线程编程的必经之路,线程相关的基本方法有wait,notify,notifyAll,sleep,join,yield等,本文浅要的介绍一下它们的使用方式。线程的状态图java将操作系统中的就绪和运行...
    99+
    2023-05-31
    java 线程 使用
  • Sqoop ETL工具的基本操作
    Sqoop ETL工具的基本操作查看 sqoop 命令说明sqoop help查看某一个命令的使用说明:sqoop cammond -help从orange,mysql到hdfssqoop import -...
    99+
    2024-04-02
  • 详解Java线程池的使用及工作原理
    目录一、什么是线程池?二、线程池要解决什么问题?三、线程池的使用四、常用阻塞队列五、线程工厂六、拒绝策略七、线程池的执行逻辑八、execute()方法九、执行流程一、什么是线程池? ...
    99+
    2024-04-02
  • C++中标准线程库的基本使用介绍
    目录1.创建线程异步执行2.通过使用互斥锁防止线程冲突3.采用信号量控制线程的运行4.通过promise实现进程间通信总结Qt的封装程度比较高的线程类用多了,发现C++标准库里面的线...
    99+
    2024-04-02
  • 详解adb工具的基本使用
    目录adb 是什么?adb的基本使用adb 是什么? adb全称Android Debug Bridge,是Android SDK中的一个工具, 使用adb可以直接操作管理Andro...
    99+
    2022-11-13
    adb工具使用 adb工具
  • 怎么安装并使用node版本工具gnvm
    这篇文章主要为大家展示了“怎么安装并使用node版本工具gnvm”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“怎么安装并使用node版本工具gnvm”这篇文章吧...
    99+
    2024-04-02
  • Node版本管理工具nvm在windows的使用方法
    这篇文章主要讲解了“Node版本管理工具nvm在windows的使用方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Node版本管理工具nvm在windo...
    99+
    2024-04-02
  • java高并发之线程的基本操作详解
    目录新建线程终止线程线程中断等待(wait)和通知(notify)挂起(suspend)和继续执行(resume)线程等待线程结束(join)和谦让(yeild)总结新建线程 新建线...
    99+
    2024-04-02
  • Node的进程管理工具pm2怎么使用
    本篇内容介绍了“Node的进程管理工具pm2怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!PM2简介PM2是一个内建了负载均衡器的n...
    99+
    2023-07-05
  • Android的HTTP操作库Volley的基本使用教程
    以前原本都用android内建的Library来进行GET、POST等等对API的连线与操作。 但最近想说来找找看有没有好用的library,应该可以事半功倍。 当初有找了三套...
    99+
    2022-06-06
    HTTP volley 教程 Android
  • Node http模块基本使用方法是什么
    这篇文章主要介绍了Node http模块基本使用方法是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Node http模块基本使用方法是什么文章都会有所收获,下面我们一起来看看吧。http 模块使用 Nod...
    99+
    2023-07-05
  • Git的基本操作流程及工作区版本库暂存区的关系
    目录1、Git的基本操作流程2、工作区、暂存区、版本库的区别(1)工作区(2)版本库(3)暂存区(4)通过新增文件理解三个区的关系(5)说明1、Git的基本操作流程 初始化一个本地版...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作