【node】多线程之worker_threads
Pre:
单线程可以理解为一个程序端口,只有一个main函数顺序执行,不需要同时执行其他main函数,js语言不支持多线程
异步io是因为有直接存储器dma,dma操作的时候并不完全依赖cpu,很多io操作都交给了dma来完成
但是这就会有一个问题:
有些时候cpu没有事情做闲着,等待返回数据,有些时候因为有计算工作,一直很忙卡到那了,没空处理返回数据,cpu利用率不高。
这时候就需要多线程,同时执行多个main函数,依次排队,等待cpu资源,使cpu的利用率提高。
worker_threads利用了node的核心v8引擎本身的特性,js不允许多线程,但是js的容器,v8或者浏览器,是允许多线程的。
这样就可以在一个端口,也就是一个进程中,生成多个node实例,多个js环境,以及多个单独的异步io事件操作,然后之间数据传递通过dma进行,同一个变量并不是在多个环境中同时处理,不断变化,而是通过io操作流转,每次都把workerData复制出来单向传递,保证了数据的前后一致性,当然你如果不想来回传递数据,也可以采用cluster的老方法,线程共享内存
但是,并不必要为了多线程而多线程,只有针对需要大量计算工作的时候,我们才需要单开线程,很多时候使用线程池也就可以了
一、how to use?
在git上传了小项目,目录粘到这里,其他的可以自己具体去看代码,注释的很清楚
01-worker_pool.js //线程池的实现
02-cpu_worker.js //接01,线程池中用到的耗时事件
03-pc_woker_threads.js //父线程和子线程的数据交换
04-cc_worker_threads.js //子线程之间的数据交换
05-cc_worker.js //接04,子线程数据交换中的线程2
其中比较重要也是比较常用的是:
01-worker_pool.js 也就是线程池的实现和使用部分,02-cpu_worker.js是提供耗时计算
里边大体实现的内容:
------------------------线程池的实现-----------------------------
1.线程池的初始化,构造函数接收两个参数,要执行耗时操作的文件路径,要开启线程的个数
2.查询是否有闲置线程
3.在闲置线程中运行耗时操作,传递消息
4.耗时操作完全结束后返回信息,销毁线程
------------------------线程池的使用----------------------------
5.线程池的对象的初始化和结果的获取
PS:因为worker_threads还在测试阶段,所以在node 文件名.js的时候需要加flag,提示是实验线程;
eg:
node --experimental-worker 01-worker_pool.js
具体还是看代码:
github:https://github.com/canwhite/QCNodeWorkerThreads
POST:
https://www.jb51.net/article/158538.htm
https://blog.csdn.net/zero_person_xianzi/article/details/99412641
https://juejin.im/post/5c63b5676fb9a049ac79a798
【node】多线程之worker_threads相关推荐
- Android多线程之ArrayBlockingQueue源码解析
阻塞队列系列 Android多线程之LinkedBlockingQueue源码解析 Android多线程之SynchronousQueue源码解析 Andorid多线程之DelayQueue源码分析 ...
- Asp.Net Core 轻松学-多线程之Task快速上手
Asp.Net Core 轻松学-多线程之Task快速上手 原文:Asp.Net Core 轻松学-多线程之Task快速上手 前言 Task是从 .NET Framework 4 开始引入的一 ...
- JAVA多线程之wait/notify
本文主要学习JAVA多线程中的 wait()方法 与 notify()/notifyAll()方法的用法. ①wait() 与 notify/notifyAll 方法必须在同步代码块中使用 ②wait ...
- linux 线程pthread_detach,linux线程之pthread_join和pthread_detach
在任何一个时间点上,线程是可结合的(joinable)或者是分离的(detached).一个可结合的线程能够被其他线程收回其资源和杀死.在 被其他线程回收之前,它的存储器资源(例如栈)是不释放的.相反 ...
- Java多线程之Callable、Future和FutureTask
Java多线程之Callable接口 自己想总结一下的,看到一篇总结的更好的博客,就转载了,突然感觉真轻松,哈哈哈哈 文章转载于:Matrix海子:Java并发编程:Callable.Future和F ...
- Java多线程之Synchronized和Lock的区别
Java多线程之Synchronized和Lock的区别 目录: 原始构成 使用方法 等待是否可以中断 加锁是否公平 锁绑定多个条件Condition 小结:Lock相比较Synchronized的优 ...
- Java多线程之CAS缺点
Java多线程之CAS缺点 目录: 循环时间开销很大 只能保证一个共享变量的原子操作 引来ABA问题及解决方案(重点) 1. 循环时间开销很大 通过看源码,我们发现有个do while,如果CAS失败 ...
- Java多线程之CAS深入解析
Java多线程之CAS深入解析 目录: CAS是什么 CAS底层原理Unsafe深入解析 CAS缺点 引子:蚂蚁花呗一面:讲一讲AtomicInteger,为什么要用CAS而不是synchronize ...
- Java多线程之volatile详解
Java多线程之volatile详解 目录: 什么是volatile? JMM内存模型之可见性 volatile三大特性之一:保证可见性 volatile三大特性之二:不保证原子性 volatile三 ...
最新文章
- 【jqgrid】疑难杂症及解决方法(随缘更新)
- R语言效用分析 ( 效能分析、Power analysis)确定样本量、假设检验与两类错误、pwr包进行效用分析 ( 效能分析、Power analysis)的常用函数列表
- 2020年日历_2020年《故宫日历》发布:浓缩紫禁城600年沧桑
- Oralce 查看,修改,kill 连接数
- linux eth_p_ip,linux数据链路访问之ETH_P_ALL等等
- 快速修改数组的某个值_我用Python,3分钟快速实现,9种经典排序算法的可视化...
- WF本质论第一章的代码
- Creating DataFrames spark当中重要的部分DataFrames
- 在小公司待了3年后,我废了
- Linux 4.16 正式发布:不再支持 8 种 CPU 架构,内核减少了 450000 行代码 !
- python下GDAL库安装——以pycharm编译器为例
- 1067 Sort with Swap(0, i)
- python旋转校正原理_Python+OpenCV实现旋转文本校正方式
- 百度杯”CTF比赛(十二月场)
- 低效程序员的9个坏习惯
- 从卫星影像的视角见证莆田母亲河(美丽的木兰溪)改造前后的容颜变化
- uni-app 中使用背景图片
- 苹果手机开不了机怎么办
- [SDOI2009]虔诚的墓主人
- kde调整分辨率_7个很酷的KDE调整将改变您的生活