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相关推荐

  1. Android多线程之ArrayBlockingQueue源码解析

    阻塞队列系列 Android多线程之LinkedBlockingQueue源码解析 Android多线程之SynchronousQueue源码解析 Andorid多线程之DelayQueue源码分析 ...

  2. Asp.Net Core 轻松学-多线程之Task快速上手

    Asp.Net Core 轻松学-多线程之Task快速上手 原文:Asp.Net Core 轻松学-多线程之Task快速上手 前言     Task是从 .NET Framework 4 开始引入的一 ...

  3. JAVA多线程之wait/notify

    本文主要学习JAVA多线程中的 wait()方法 与 notify()/notifyAll()方法的用法. ①wait() 与 notify/notifyAll 方法必须在同步代码块中使用 ②wait ...

  4. linux 线程pthread_detach,linux线程之pthread_join和pthread_detach

    在任何一个时间点上,线程是可结合的(joinable)或者是分离的(detached).一个可结合的线程能够被其他线程收回其资源和杀死.在 被其他线程回收之前,它的存储器资源(例如栈)是不释放的.相反 ...

  5. Java多线程之Callable、Future和FutureTask

    Java多线程之Callable接口 自己想总结一下的,看到一篇总结的更好的博客,就转载了,突然感觉真轻松,哈哈哈哈 文章转载于:Matrix海子:Java并发编程:Callable.Future和F ...

  6. Java多线程之Synchronized和Lock的区别

    Java多线程之Synchronized和Lock的区别 目录: 原始构成 使用方法 等待是否可以中断 加锁是否公平 锁绑定多个条件Condition 小结:Lock相比较Synchronized的优 ...

  7. Java多线程之CAS缺点

    Java多线程之CAS缺点 目录: 循环时间开销很大 只能保证一个共享变量的原子操作 引来ABA问题及解决方案(重点) 1. 循环时间开销很大 通过看源码,我们发现有个do while,如果CAS失败 ...

  8. Java多线程之CAS深入解析

    Java多线程之CAS深入解析 目录: CAS是什么 CAS底层原理Unsafe深入解析 CAS缺点 引子:蚂蚁花呗一面:讲一讲AtomicInteger,为什么要用CAS而不是synchronize ...

  9. Java多线程之volatile详解

    Java多线程之volatile详解 目录: 什么是volatile? JMM内存模型之可见性 volatile三大特性之一:保证可见性 volatile三大特性之二:不保证原子性 volatile三 ...

最新文章

  1. 【jqgrid】疑难杂症及解决方法(随缘更新)
  2. R语言效用分析 ( 效能分析、Power analysis)确定样本量、假设检验与两类错误、pwr包进行效用分析 ( 效能分析、Power analysis)的常用函数列表
  3. 2020年日历_2020年《故宫日历》发布:浓缩紫禁城600年沧桑
  4. Oralce 查看,修改,kill 连接数
  5. linux eth_p_ip,linux数据链路访问之ETH_P_ALL等等
  6. 快速修改数组的某个值_我用Python,3分钟快速实现,9种经典排序算法的可视化...
  7. WF本质论第一章的代码
  8. Creating DataFrames spark当中重要的部分DataFrames
  9. 在小公司待了3年后,我废了
  10. Linux 4.16 正式发布:不再支持 8 种 CPU 架构,内核减少了 450000 行代码 !
  11. python下GDAL库安装——以pycharm编译器为例
  12. 1067 Sort with Swap(0, i)
  13. python旋转校正原理_Python+OpenCV实现旋转文本校正方式
  14. 百度杯”CTF比赛(十二月场)
  15. 低效程序员的9个坏习惯
  16. 从卫星影像的视角见证莆田母亲河(美丽的木兰溪)改造前后的容颜变化
  17. uni-app 中使用背景图片
  18. 苹果手机开不了机怎么办
  19. [SDOI2009]虔诚的墓主人
  20. kde调整分辨率_7个很酷的KDE调整将改变您的生活

热门文章

  1. 关于给平板装win系统的装了两天的问题
  2. Python将CSV文件转换为Excel文件
  3. Linux系统管理实践(7):网络配置
  4. ListBox数据更新
  5. Javascript学习笔记:apply()的使用
  6. FPGA 视频拼接器的底板
  7. JS: 填充指定长度字符串到目标字符串
  8. 棒材轧机轧制力矩matlab数学模型,一种普通热轧棒材的轧制力能校核计算方法与流程...
  9. 日研发能跟踪气味信息的小型机器人
  10. 计算机专业最好考的职称一览表,各类专业技术职称一览表(全).doc