有多少承诺可以或应该同时 运行 有限制吗?
Is there a limit to how many promises can or should run concurrently?
令人惊讶的是 google 无法返回此问题的结果。
我想知道有多少承诺可以或应该 运行 在排队并等待下一个完成之前并行。我想这可能取决于用户的互联网,但我认为这值得一问。
如果它基于用户的 ISP/connection 类型,有没有办法测试在启动队列之前发送的理想承诺数量?
另外,我是严格从客户端说起的。所以,单线程js.
示例代码:
function uploadToServer(requestData){
return Promise((...));
}
function sendRequests(requestArray){
var count = 0;
for(var requestData in requestArray){
if(count<idealAmount){
uploadToServer(idealAmount).then(count--);
count++;
}else{
// Logic to wait before attempting to fire event
}
}
}
Promise 本身没有特定的编码限制。它们只是一个通知系统,你可以拥有数百万个它们(只要你有足够的内存来容纳这些 Javascript 对象)。
现在,如果一个 promise 表示一个底层异步操作(他们通常这样做),那么很可能会有一些限制可以同时运行的特定类型的异步操作的数量。例如,在某些时候,您可能 运行 限制单个主机同时接受您的请求数量。或者,您可能 运行 陷入本地资源问题,某处有数以万计的连接。
对于node.js磁盘I/O操作,底层磁盘I/O子系统已经有一个排队系统,因此实际上只有少量操作运行立即 ning,其余的排队。
所以,要回答你能有多少个并发操作的问题,只能在特定类型的异步请求,有时甚至是特定类型的接收主机的上下文中分析和回答。
如果您知道您正在处理大量或可能大量的请求,并且您将为该数组中的每一项发送网络请求,那么通常自己编写一个限制以避免淹没本地资源或目标主机资源。这通常不是通过队列完成的,而是只启动 N 个请求的代码,然后当一个请求完成时,它启动下一个请求,依此类推。 Bluebird 和 Async 库都有为您管理它的方法。在 Bluebird 中,它是 Promise.map()
的 concurrency
选项。我还手动编写了多次管理并发连接数的循环,这里是部分代码的链接:
Choose proper async method for batch processing for max requests/sec
Nodejs: Async request with a list of URL
正如@jfried00 提到的那样,运行ning 的数量没有任何限制,因为没有 运行ning 和 Promise
这样的东西。一旦你 运行 async function
或 运行 像 new Promise(res => something(res))
这样的代码,方法就是 运行.
您可以做的是限制解析的承诺链的数量:
// ten promises ago:
let oldPromise = doSomethingAsync();
// and now:
oldPromise.then(doSomethingNewAsync());
但实际上,如我的示例所示,您自己编写代码会使您的头发很快变白 - 错误处理、查找空槽和保持流程的正确顺序将很困难。
这说的是可能的,我的框架 Scramjet,我会厚颜无耻地插入此处,满足您的需求:
DataStream.from(requestArray)
.setOptions({maxParallel: 4})
.unorder(requestData => uploadToServer(requestData))
.run()
Scramjet 将保持 4 个承诺解决但不会尝试保持顺序(还有其他方法)并且您可以使用任何功能 - 如果它没有 return 一个承诺,它会起作用就像它一样。 unordered transforms in scramjet 上有更多文字。如果您愿意自己做,也可以查看源代码...
令人惊讶的是 google 无法返回此问题的结果。
我想知道有多少承诺可以或应该 运行 在排队并等待下一个完成之前并行。我想这可能取决于用户的互联网,但我认为这值得一问。
如果它基于用户的 ISP/connection 类型,有没有办法测试在启动队列之前发送的理想承诺数量?
另外,我是严格从客户端说起的。所以,单线程js.
示例代码:
function uploadToServer(requestData){
return Promise((...));
}
function sendRequests(requestArray){
var count = 0;
for(var requestData in requestArray){
if(count<idealAmount){
uploadToServer(idealAmount).then(count--);
count++;
}else{
// Logic to wait before attempting to fire event
}
}
}
Promise 本身没有特定的编码限制。它们只是一个通知系统,你可以拥有数百万个它们(只要你有足够的内存来容纳这些 Javascript 对象)。
现在,如果一个 promise 表示一个底层异步操作(他们通常这样做),那么很可能会有一些限制可以同时运行的特定类型的异步操作的数量。例如,在某些时候,您可能 运行 限制单个主机同时接受您的请求数量。或者,您可能 运行 陷入本地资源问题,某处有数以万计的连接。
对于node.js磁盘I/O操作,底层磁盘I/O子系统已经有一个排队系统,因此实际上只有少量操作运行立即 ning,其余的排队。
所以,要回答你能有多少个并发操作的问题,只能在特定类型的异步请求,有时甚至是特定类型的接收主机的上下文中分析和回答。
如果您知道您正在处理大量或可能大量的请求,并且您将为该数组中的每一项发送网络请求,那么通常自己编写一个限制以避免淹没本地资源或目标主机资源。这通常不是通过队列完成的,而是只启动 N 个请求的代码,然后当一个请求完成时,它启动下一个请求,依此类推。 Bluebird 和 Async 库都有为您管理它的方法。在 Bluebird 中,它是 Promise.map()
的 concurrency
选项。我还手动编写了多次管理并发连接数的循环,这里是部分代码的链接:
Choose proper async method for batch processing for max requests/sec
Nodejs: Async request with a list of URL
正如@jfried00 提到的那样,运行ning 的数量没有任何限制,因为没有 运行ning 和 Promise
这样的东西。一旦你 运行 async function
或 运行 像 new Promise(res => something(res))
这样的代码,方法就是 运行.
您可以做的是限制解析的承诺链的数量:
// ten promises ago:
let oldPromise = doSomethingAsync();
// and now:
oldPromise.then(doSomethingNewAsync());
但实际上,如我的示例所示,您自己编写代码会使您的头发很快变白 - 错误处理、查找空槽和保持流程的正确顺序将很困难。
这说的是可能的,我的框架 Scramjet,我会厚颜无耻地插入此处,满足您的需求:
DataStream.from(requestArray)
.setOptions({maxParallel: 4})
.unorder(requestData => uploadToServer(requestData))
.run()
Scramjet 将保持 4 个承诺解决但不会尝试保持顺序(还有其他方法)并且您可以使用任何功能 - 如果它没有 return 一个承诺,它会起作用就像它一样。 unordered transforms in scramjet 上有更多文字。如果您愿意自己做,也可以查看源代码...