mapLimit有什么意义?

时间:2019-04-16 05:46:19

标签: node.js async.js

异步lib中的功能点arr = list(range(10))[::-1] print(arr) # prints [9, 8, 7, 6, 5, 4, 3, 2, 1, 0] result = insertion_sort(arr) print(result) # prints [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 是什么?我认为Node使用内部线程池来限制一次异步操作的数量。此外,我们在Node中只有一个线程,并且它使用事件循环(这意味着我们在该线程中一次执行一个操作)。有人可以解释为什么我们需要它吗?

2 个答案:

答案 0 :(得分:2)

实际上,对于网络I / O节点,不使用线程池。它完全使用一个线程:主线程。

是的,节点不能并行执行代码。

但是节点可以等待并行发生。这是异步/非阻塞I / O的本性,无论您使用的是node.js还是C ++或Java或go,都是如此。

没有<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <div class="info"> <input class="name" type="text" /> <input class="birth" type="text" maxlength="8" /> <input class="phone" type="text" maxlength="11" /> </div> <button onclick="chk_val()">Check</button>节点将立即发出所有请求(如果您正在处理一千次下载,则该节点将尽职尽力地做到这一点)。由于某些服务有速率限制,因此这并不总是可取的,而且您还会遇到请求超时问题。因此,mapLimit仅允许您并行等待有限数量的异步操作。

答案 1 :(得分:0)

我终于找到答案了。这与Node中处理操作堆栈的主线程有关。

我们要避免的主要问题是RangeError: Maximum call stack size exceeded。就是这样。

假设我们有很多异步操作,它们都将一些结果返回到主线程(到主堆栈),以便在完成工作后进行处理。

这里要点是,我们只需要以某种方式限制它们在堆栈中的数量。怎么样?只需一次限制异步操作​​的数量,因此异步操作完成工作后,我们无需在主堆栈中处理很多操作。

重要的是要了解它不能保证成功。因为即使并发异步操作的数量有限,但是我们在主堆栈中的同步操作非常慢,所以我们的堆栈最终将崩溃,并且无论如何我们都会得到RangeError: Maximum call stack size exceeded