node . js”多线程”怎么处理高并发任务吗?

  介绍

小编给大家分享一下node . js”多线程”怎么处理高并发任务?,希望大家阅读完这篇文章之后都有所收获、下面让我们一起去探讨吧!

,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,下面本篇文章给大家介绍一下使用nodejs“多线”程处理高并发任务的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。

相关推荐:《nodejs视频教程》

<强>摩尔定律

摩尔定律是由英特尔联合创始人戈登·摩尔(Gordon Moore)在1965年提出的,即集成电路上可容纳的元器件的数量每隔18至24个月就会增加一倍,性能也将提升一倍。也就是说,处理器(CPU)的性能每隔大约两年就会翻一倍。

距离摩尔定律被提出到现在,已经过去了50多年。如今,随着芯片组件的规模越来越接近单个原子的规模,要跟上摩尔定律的步伐变得越来越困难。

在2019年,英伟达首席执行官黄仁勋在ECS展会上说:“摩尔定律过去是每5年增长10倍,每10年增长100倍。而如今,摩尔定律每年只能增长几个百分点,每10年可能只有2倍,因此,摩尔定律结束了。”

单个处理器(CPU)的性能越来越接近瓶颈,想要突破这个瓶颈,则需要充分利用<代码>多线程技术> 可以同时执行多个线程,更快的完成计算机任务。

<强>节点的多线程

我们都知道,<代码> Javascript代码是单线程语言,<代码> nodejs 利用Javascript <代码> 的特性,使用事件驱动模型,实现了异步I/O,而异步I/O的背后就是多线程调度。

<代码>节点异步I/O的实现可以参考朴灵的《深入浅出节点。js》

在<代码> 去语言中,可以通过创建<代码> Goroutine> GOMAXPROCS>

在<代码> 节点中,没有<代码> 可API以显式创建新线程的,<代码>节点> fs.readFile ,<代码> http。请求>

服务端开发,工具开发可能都会需要使用到多线程开发。比如使用多线程处理复杂的爬虫任务,用多线程来处理并发请求,使用多线程进行文件处理等等……

在我们使用多线程时,一定要控制最大同时并发数。因为不控制最大并发数,可能会导致<代码>文件描述符>

在<代码>节点> 或<代码> API者环境变量,所以接下来,我们就用几行简单的代码来实现。

<强>代码实现

我们先假设下面的一个需求场景,我有一个爬虫,需要每天爬取100篇掘金的文章,如果一篇一篇爬取的话太慢,一次爬取100篇会因为网络连接数太多,导致很多请求直接失败。

那我们可以来实现一下,每次请求10篇,分10次完成。这样不仅可以把效率提升10倍,并且可以稳定运行。

下面来看看单个请求任务,代码实现如下:

const  axios =,要求(“axios");      async  function  singleRequest (article_id), {//才能,这里我们直接使用,axios 库进行请求   const 才能;reply =, await  axios.post (   ,,,“https://api.juejin.cn/content_api/v1/article/detail"   ,,,{   ,,,,,article_id,   ,,,}   ,,);      return 才能;reply.data;   }

为了方便演示,这里我们100次请求的都是同一个地址,我们来创建100个请求任务,代码实现如下:

//,请求任务列表   const  requestFnList =, new 数组(100)   .fill才能(“6909002738705629198”)   ,,. map ((id),=祝辞,(),=祝辞,singleRequest (id),

接下来,我们来实现并发请求的方法。这个方法支持同时执行多个异步任务,并且可以限制最大并发数。在任务池的一个任务执行完成后,新的异步任务会被推入继续执行,以保证任务池的高利用率。代码实现如下:

const  chalk =,要求(“chalk");   {const  log },=,要求(“console");/* *   ,*执行多个异步任务   ,* @param  {*}, fnList 任务列表   ,* @param  {*}, max 最大并发数限制   ,* @param  {*}, taskName 任务名称   ,*/async  function  concurrentRun (fnList =, [],, max =, 5日,taskName =,“未命名“),{   if 才能;(! fnList.length),返回;      日志才能(chalk.blue(“开始执行多个异步任务,最大并发数:,${马克斯}'));   const 才能;replyList =,[];,//,收集任务执行结果   const 才能;count =, fnList.length;,//,总任务数量   const 才能;startTime =, new 日期().getTime();,//,记录任务执行开始时间      let 才能;current =, 0;//才能,任务执行程序   const 才能;schedule =, async (索引),=祝辞,{   ,,,return  new 承诺(async (解决),=祝辞,{   ,,,,,const  fn =, fnList(指数);   ,,,,,if  (fn), return 解决();      ,,,,,//,执行当前异步任务   ,,,,,const  reply =, await  fn ();   ,,,,,replyList(指数),=,回复;   ,,,,,日志(“$ {taskName},事务进度,$ {((+ + current /,计数),*,100).toFixed (2)} %, ');      ,,,,,//,执行完当前任务后,继续执行任务池的剩余任务   ,,,,,await 时间表(时间+ index  max);   ,,,,,解决();   ,,,});   ,,};//才能,任务池执行程序   const 才能;scheduleList =, new 数组(max)   ,,,.fill (0)   ,,,. map((_,指数),=祝辞,时间表(指数));//,才能使用,Promise.all 批量执行   const 才能;r =, await  Promise.all (scheduleList);      null   null   null   null   null   null   null   null   null   null

node . js”多线程”怎么处理高并发任务吗?