目录

  • 前言
  • 主线程与工作线程
  • 工作线程交互
  • 尾言

前言

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

主线程与工作线程

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

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

主线程(main.js

  1. 引入工作线程构造函数Worker传入work.js的文件地址创建工作线程work
  2. 工作线程work可以通过postMessage传递数据,这里传递了一个对象过去。
  3. 工作线程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

  1. 引入parentPort可以与主线程(引入了该工作线程的线程)进行交互。
  2. parentPort.onmessage方法可以获取主线程传来的数据,与work.postMessage相对应,传来的数据在event.data中,event还有一些其他参数。
  3. parentPort.postMessage方法可以传递数据去主线程,与work的监听message方法相对应
import {parentPort} from 'worker_threads'const getSum = (x, y) => {return x + y
}parentPort.onmessage = (event) => {const {x, y} = event.dataconst 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来进行工作线程间的交互呢?

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

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

主线程(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

  1. 从主线程传来的port可以通过event.ports[0]得到,我们在工作线程1创建好port1的监听事件,随时可以接收到port2传来的数据。
  2. 同时我们在额外创建一个send类型事件,就可以在主线程,控制两个工作线程之间传递消息了。
import {parentPort} from 'worker_threads'let port1parentPort.onmessage = (event) => {const {type, value} = event.dataswitch (type) {case 'port':port1 = event.ports[0]port1.onmessage = ev => {console.log(ev.data) }breakcase 'send':port1.postMessage(value)breakdefault:break}
}

工作线程2(work2.js

与工作线程1同理。

import {parentPort} from "worker_threads";let port2parentPort.onmessage = (event) => {const {type, value} = event.dataswitch (type) {case 'port':port2 = event.ports[0]port2.onmessage = ev => {console.log(ev.data)}breakcase 'send':port2.postMessage(value)breakdefault:break}
}

尾言

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

如果有任何错误或者建议,欢迎指出,我会及时修改。

如果文章对你有帮助的话,欢迎点赞收藏~

nodejs 工作线程的基本使用(worker_threads)相关推荐

  1. HDFS源码分析心跳汇报之BPServiceActor工作线程运行流程

    在<HDFS源码分析心跳汇报之数据结构初始化>一文中,我们了解到HDFS心跳相关的BlockPoolManager.BPOfferService.BPServiceActor三者之间的关系 ...

  2. 多工作线程获取工作队列简单实现

    以下是APUE线程章节中,简单实现多工作线程获取工作队列源码! #include <stdio.h> #include <stdlib.h> #include <stri ...

  3. IIS连接数、IIS并发连接数、IIS最大并发工作线程数、应用程序池的队列长度、应用程序池的...

    IIS连接数 一般购买过虚拟主机的朋友都熟悉购买时,会限制IIS连接数,这边先从普通不懂代码用户角度理解IIS连接数 顾名思义即为IIS服务器可以同时容纳客户请求的最高连接数,准确的说应该叫" ...

  4. IIS连接数、IIS并发连接数、IIS最大并发工作线程数、应用程序池的队列长度、应用程序池的......

    IIS连接数 一般购买过虚拟主机的朋友都熟悉购买时,会限制IIS连接数,这边先从普通不懂代码用户角度理解IIS连接数 顾名思义即为IIS服务器可以同时容纳客户请求的最高连接数,准确的说应该叫" ...

  5. Mirror--镜像使用的工作线程数

    /* 在SQL SERVER 2005 及以后版本中, 使用'MAXworker thread' 来配置 可用的线程数,默认设置为0 ,即自动控制线程数   计算最大工作线程数:   对于32 位系统 ...

  6. c#中在工作线程创建窗体并操作

    实例1 public void CycleShow()//循环绘图         { Task.Factory.StartNew(() =>             {          // ...

  7. Delphi-IOCP学习笔记三====工作线程和Listener

    接第一次代码继续分析 usesJwaWinsock2, Windows, SysUtils;constDATA_BUFSIZE = 1024;IO_TYPE_Accept = 1;IO_TYPE_Re ...

  8. TSQLDBServerHttpApi使用工作线程池

    TSQLDBServerHttpApi使用工作线程池 TSQLDBServerHttpApi创建时,默认是使用单线程模式,且只使用一个数据库连接,服务端要应对众多的客户端只靠一个工作线程(主线程)和一 ...

  9. 工作线程AfxBeginThread的使用

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 工作线程 ...

最新文章

  1. golang 不定参 可变参 使用 传递
  2. leetcode算法题--数组中出现次数超过一半的数字
  3. 搞定Go单元测试(三)—— 断言(testify)
  4. Android开发之蓝牙(Bluetooth)操作(一)--扫描已经配对的蓝牙设备
  5. LeetCode - 48. Rotate Image
  6. python post json参数,Python requests.post方法中data与json参数区别详解
  7. Setup Factory 安装程序的图标
  8. 小米手机系统服务组件是干什么的_小米手机的云服务也太好用了吧?!手机丢了完全不用怕了...
  9. html 表格横向排列,excel表格数据如何实现横向排列-Excel表格怎样把多列横向数据按照顺序改为纵向排列......
  10. PM at Google —— 最全产品经理常用术语及知识点,建议收藏!
  11. C++ Programming Basic acknowledge
  12. 趣图 | 程序员的白天 vs 夜晚?
  13. 数学成绩英语成绩c语言,用链表输入一个正整数n,再输入n 个学生的学号和数学,英语,C语言成绩,要求...
  14. mac版本钉钉6.0.18版本无法获取摄像头权限问题
  15. 不成熟的梦想家 (未熟DREAMER)
  16. kali 设置中文并安装输入法
  17. 爬虫工程师想拿更高薪,这点不要忽略
  18. 局域网访问IIS express
  19. 日志2021年11月
  20. python 梦幻西游手游脚本_梦幻西游手游抢怪有什么技巧 梦幻西游抢怪技巧

热门文章

  1. python代码电影人物关系_以腾讯5000部电影为例,告诉你Python数据分析该怎么做...
  2. Flask Web开发入门(一)之简单的登录验证
  3. KMIP4J数据处理流程
  4. java 面向对象P60
  5. b2b b2c商城 php,免费开源商城系统,网店系统,B2C商城系统,微商城,PHP开源商城系统-ShopBuilder...
  6. 基于C++的音乐厅门票预定系统
  7. python打印hello word_在屏幕上打印输出Hello World,使用的Python语句是( )_学小易找答案...
  8. 快速排序----科大讯飞2021 java开发岗
  9. charles的web端教程
  10. linux下载/解压ImageNet-1k数据集