位置: 编程技术 - 正文

nodejs中使用多线程编程的方法实例(nodejs怎么实现多线程)

编辑:rootadmin

推荐整理分享nodejs中使用多线程编程的方法实例(nodejs怎么实现多线程),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:nodejs操作dom,nodejs 工作线程,node怎么实现多线程,nodejs多线程还是单线程,nodejs多线程爬虫,node.js 多线程,node怎么实现多线程,nodejs怎么实现多线程,内容如对您有帮助,希望把文章链接给更多的朋友!

在以前的博文别说不可能,nodejs中实现sleep中,我向大家介绍了nodejs addon的用法。今天的主题还是addon,继续挖掘c/c++的能力,弥补nodejs的弱点。

我曾多次提到过nodejs的性能问题。其实就语言本身而言,nodejs的性能还是很高的,虽然不及大多部静态语言,但差距也并不大;相对其他动态语言而言,速度优势非常明显。但为什么我们常常说nodejs不能胜任CPU密集型场景呢?因为由于其单线程特性,对于CPU密集型场景,它并不能充分利用CPU。计算机科学中有一个著名的Amdahl定律:

假设总工作量W,可以分解为两个部分:只能串行计算的Ws和允许并行计算的Wp。那么,在p个CPU并行计算的情况下,性能上能够带来speedup倍的提升。Amdahl定律描述了并行能做到的和不能做到的。它是一种理想情况,实际情况会复杂得多。比如并发很可能会引起资源的争夺,需要增加各种锁,从而常常让并行处于等待状态;并发还会额外带来操作系统对线程调度切换的时间开销,增加Ws。不过,当一项任务中,Wp比Ws大得多,并且有多个CPU核心可供使用时,并行带来的性能提升是相当可观的。

好,回到nodejs上。我们设想一个计算场景:计算内的质数数目。这个场景编程实现的时候,以除法运算为主,不涉及内存、对象等操作,理论上能够确保让nodejs以相对较快的速度运行,不会落后c太多,便于对比。

javascript寻找质数的方法已经在这篇博客中提供了,直接抄过来:

再写一个c语言版本的:

在nodejs中,我们用一个从1到的循环来检索质数;c语言中,我们设置若干个线程,定义count为,每个线程做如下操作要:如果count大于0,则取出count的值,并计算是否为质数,同时将count减1。根据这个思路,javascript版本的很容易写:

关键难点就是c语言的多线程编程。早期c/c++并没有考虑并行计算的需求,所以标准库中并没有提供多线程支持。而不同的操作系统通常实现也是有区别的。为了避免这种麻烦,我们采用pthread来处理线程。

下载pthread最新版本。由于我对gyp不熟,link依赖lib搞了半天没搞定,最后我的方式是,直接把pthread的源代码放到了项目目录下,并在binding.gyp中把pthread.c添加到源代码列表中,在编译项目的时候把pthread也编译一次。修改后的binding.gyp是这样的:

nodejs中使用多线程编程的方法实例(nodejs怎么实现多线程)

当然了,我这种方法很麻烦,如果你们只添加pthread中lib和include目录的引用,并且不出现依赖问题,那是最好的,就没有必要用我的方法来做。

那么接下来就进入C/C++多线程的一切了,定义一个线程处理函数:

在线程与线程之间,对于count这个变量是相互竞争的,我们需要确保同时只能有一个线程操作count变量。我们通过 pthread_mutex_t lock; 添加一个互斥锁。当执行 pthread_mutex_lock(&lock); 时,线程检查lock锁的情况,如果已锁定,则等待、重复检查,阻塞后续代码运行;如果锁已释放,则锁定,并执行后续代码。相应的, pthread_mutex_unlock(&lock); 就是解除锁状态。

由于编译器在编译的同时,进行编译优化,如果一个语句没有明确做什么事情,对其他语句的执行也没有影响时,会被编译器优化掉。在上面的代码中,我加入了统计质数数量的代码,如果不加的话,像这样的代码:

是会直接被编译器跳过的,实际不会运行。

添加addon的写法已经介绍过了,我们实现从javascript接收一个参数,表示线程数,然后在c中创建指定数量的线程完成质数检索。完整代码:

phread_create可以创建线程,默认是joinable的,这个时候子线程受制于主线程;phread_join阻塞住主线程,等待子线程join,直到子线程退出。如果子线程已退出,则phread_join不会做任何事。所以对所有的线程都执行thread_join,可以保证所有的线程退出后才会例主线程继续进行。

完善一下nodejs脚本:

看一下测试结果:

单线程时,虽然C/C++的运行速度是nodejs的%,但这个成绩我们认为在动态语言中,还是非常不错的。双线程时速度提升最明显,那是因为我的电脑是双核四线程CPU,这个时候已经可能在使用两个核心在进行处理。4线程时速度达到最大,此时应该是双核四线程能达到的极限,当线程再增加时,并不能再提升速度了。上述Amdahl定律中,p已达上限4。再增加线程,会增加操作系统进程调度的时间,增加锁的时间,尽管同时也能增加对CPU时间的竞争,但总体而言,Ws的增加更加明显,性能是下降的。如果在一台空闲的机器上做这个实验,数据应该会更好一点。

从这个实验中,我们可以得出这样的结论,对于CPU密集型的运算,交给静态语言去做,效率会提高很多,如果计算中较多涉及内存、字符串、数组、递归等操作(以后再验证),性能提升更为惊人。同时,合理地利用多线程能有效地提高处理效率,但并不是线程越多越好,要根据机器的情况合理配置。

对于nodejs本身,的确是不擅长处理CPU密集的任务,但有了本文的经验,我想,想克服这个障碍,并非什么不可能的事情。

nw.js实现类似微信的聊天软件 nw.js实现类似微信的聊天软件公司qq被屏蔽,微信被屏蔽,怎么与外边通讯,你懂的。当然,也适合公司自己内部架设服务器,通讯。项目地址:freechat

node-webkit打包成exe文件被误报木马的解决方法 最近项目需要用到node-webkit。处理古老级用户的兼容以及他们心里的‘数据安全'问题。1、下载完node-webkit2、制作appName.nw文件3、copy/bnw.exe+appName.nwTestAppNa

nodeJS代码实现计算交社保是否合适 按一个普通程序员的月收入算就是的社保金,而且要延迟到岁退休,我过完年就是岁,这笔账和余额宝比对一下,我顿时明白了fuckShebao:function(req,res,

标签: nodejs怎么实现多线程

本文链接地址:https://www.jiuchutong.com/biancheng/378021.html 转载请保留说明!

上一篇:nodejs中实现阻塞实例(nodejs quic)

下一篇:node-webkit打包成exe文件被360误报木马的解决方法(node js打包exe)

  • 实际已缴纳所得税额在汇算清缴报告里怎么看
  • 债权投资减值的账务处理
  • 销售收入的暂估入账是否结转利润
  • 收到的其他与筹资活动有关的现金包括
  • 外商投资企业与内资合资是国企吗
  • 进口奶牛缴纳增值税
  • 专票只有抵扣联发票联丢失怎么办
  • 小规模纳税人每个月需要报什么税
  • 公司支付员工工伤赔偿怎么做账
  • 固定资产采购计入什么科目
  • 内部损益表
  • 公司名下没有车可以开运输发票吗
  • 融资租赁中承租人的权利
  • 换汇成本跟进项有关系吗
  • 合同印花税怎么交
  • 消费税的纳税环节可能有
  • 进项借方有余额怎么调账
  • 税号里面字母是大写吗
  • 免租要怎么交税
  • 应收账款减值准备计提比例
  • linux alias永久生效
  • 跨年期许
  • 使用权资产
  • php大小写转换函数怎么写
  • 要求快速启动
  • 收到押金缴国库费怎么办
  • php preg_split
  • php require include
  • 移动有聊天室平台吗
  • 一列火车穿过一条隧道,已知火车长450米,隧道长750米
  • 购买商品房交税流程
  • 资产负债表要点
  • 厂房维修费是制造费用还是管理费用
  • Vue2 Element description组件 列合并
  • 背书转让的步骤
  • promise基本使用
  • lvs命令详解
  • 物流发票的税率怎么算
  • 多交增值税计入什么科目
  • 销售折扣购物卡怎么做账
  • 已申报未导入是什么情况
  • 招待费的进项税必须认证后转出吗
  • 什么是记账凭证账务处理程序
  • 如何做进项税额明细表
  • 用于研发的材料后期销售了应该怎么账务处理
  • 汽车4s店厂家返修流程
  • 发票记账联可以给客户吗
  • switch关键账号教程
  • 企业所得税汇算清缴补缴税款分录
  • 企业年报股东出资信息
  • 跨年租金如何确权
  • 长期股权投资的核算方法
  • sql server中的编程语言
  • mysql语句性能优化
  • 注销公司流程超详细
  • 国债利息收入要征税吗
  • 其他应付款可以转主营业务收入吗
  • 广告公司奖金激励分配方案
  • 股份支付应如何进行账务处理?
  • 调表不调账都有什么情况
  • 筹资费用和财务费用一样吗
  • 企业给加盟店的钱怎么算
  • 银行手续费没拿可以退吗
  • 代扣代缴的个人所得税在现金流量表
  • 职工教育经费开专票可以抵扣吗
  • 出纳提取现金的业务流程
  • 购入固定资产一次性扣除政策
  • 设备的验证服务包括
  • 会计一般用什么软件
  • 三星笔记本电脑
  • win10周年更新版是什么意思
  • linux使用mv命令,结果文件不见了
  • 浅谈特殊儿童的融合教育论文
  • python三角形角度
  • jQuery Ajax传值到Servlet出现乱码问题的解决方法
  • 疯狂android讲义和第一行代码
  • 十大上海企业纳税排行榜
  • 增值税发票增版增量怎么办理
  • 企业未开立基本存款账户承诺书的相关规定
  • 大专学费减免多少
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设