node如何处理同时发起上百个请求?
发布于 8 年前 作者 rongchanghai 7174 次浏览 来自 问答

node是单线程非阻塞,多数问题都会交给异步来处理,但是如果

for (var i = 0; i < 1000; i++) {
  //http 请求
}

同时发起1000个异步请求,如何使用线程池来很好的控制,而不至于崩掉?

11 回复

那个不叫线程池,只是一个Event队列。不是线程,更不是线程池,不需要控制释放,因为执行完就释放了

@zy445566 恩恩,是的,那这个事件队列如何控制事件的进出呢?就是同时执行1000个请求,Event队列中有10个,出一个进一个,这种如何来实现?

@rongchanghai 怎么控制的就是nodejs里自己处理的了吧

@rongchanghai thenjs的eachLimit试试

来自酷炫的 CNodeMD

说白了就执行完同步代码,再死循环读取队列里面的代码,然后执行。所以同步代码有死循环,永远不可能执行队列里面的代码

这里其实要看你写的那个http请求是异步方式,还是同步方式了,常规来说,请求外部资源,一般都是异步方式,那么,这时你可以认为是在event队列中插入了1000个任务,nodejs会顺序执行这1000个任务,并等待这1000个请响应后再回call你的代码.当然了,nodejs在发起这1000个任务时,也会启动大量线程去处理的,不过一般是由底层的c++代码实现的了,我们在编写代码时不太用关心这个问题. 如果你不希望同一时刻出现太多链接,你可以试试async.eachLimit来试试.用来控制同一时刻,对外请求的数量.

promise-map-limit,可以控制并发数。

@liygheart 不是node自己处理的,需要自己控制,否则有多少请求node就直接发多少,如果CPU满了就宕机

@ugrg 应该是使用这些库的 Limit 的 API来控制一下,我觉得node应该有那种控制对外发请求的模块吧,我不太清楚,像这中同时需要发起上百上千个请求的例子,应该是我们在编程的时候需要控制的把,尽量避免这样写。还是说使用async.eachLimit这些类似的来控制。不是很了解。反正我自己写的是用promise+setTimeout 来控制多长时间发一个请求,全部完成之后再 then下去。

@rongchanghai 你去npm上下载一个async模块,很好用的这个.

回到顶部