如何编写限制Qpromise并发的方法?
例如,我有一个方法spawnProcess
。
我希望一次生成不超过5个进程,但对调用代码是透明的。
我需要实现的是一个带有签名的函数
function limitConcurrency(promiseFactory, limit)
我可以这样称呼他
spawnProcess = limitConcurrency(spawnProcess, 5);
// use spawnProcess as usual
我已经开始编写我的版本,但我想知道是否有人有一个简洁的实现,我可以对照它进行检查。
spawnProcess = deferred.gate(spawnProcess, 5);
这似乎对我有用。
我不确定我是否能简化它。scheduleNextJob
中的递归是必需的,因此正在运行
也可作为要点提供。
'use strict';
var Q = require('q');
/**
* Constructs a function that proxies to promiseFactory
* limiting the count of promises that can run simultaneously.
* @param promiseFactory function that returns promises.
* @param limit how many promises are allowed to be running at the same time.
* @returns function that returns a promise that eventually proxies to promiseFactory.
*/
function limitConcurrency(promiseFactory, limit) {
var running = 0,
semaphore;
function scheduleNextJob() {
if (running < limit) {
running++;
return Q();
}
if (!semaphore) {
semaphore = Q.defer();
}
return semaphore.promise
.finally(scheduleNextJob);
}
function processScheduledJobs() {
running--;
if (semaphore && running < limit) {
semaphore.resolve();
semaphore = null;
}
}
return function () {
var args = arguments;
function runJob() {
return promiseFactory.apply(this, args);
}
return scheduleNextJob()
.then(runJob)
.finally(processScheduledJobs);
};
}
module.exports = {
limitConcurrency: limitConcurrency
}
我有一个图书馆为你做这件事https://github.com/ForbesLindesay/throat
您可以通过browserify使用它,也可以从brcdn下载独立版本(https://www.brcdn.org/?module=throat
然后(假设Promise
构造函数是多填充的或在您的环境中实现的),您可以执行以下操作:
//remove this line if using standalone build
var throat = require('throat');
function limitConcurrency(promiseFactory, limit) {
var fn = throat(promiseFactory, limit);
return function () {
return Q(fn.apply(this, arguments));
}
}
您可以直接调用though(promiseFactory,limit)
,但这将返回一个promise-promise,而不是Q-promise。
我也很喜欢使用数组。地图
// only allow 3 parallel downloads
var downloadedItems = Q.all(items.map(throat(download, 3)));
有没有使用Qpromise库限制promise并发的方法? 这个问题有点与如何限制Qpromise并发有关? 但问题是我正试图这样做: 真正的用例是: 从DB获取帖子 循环DB中的每个帖子,如 对于每个帖子做task1,task2,task3(检索社交计数器,检索评论计数等) 在DB中保存新的文章数据。 但问题是node同时执行所有帖子的所有任务,比如同时向facebook询问500篇帖子的“喜欢
问题内容: 如何编写限制Q许诺并发的方法? 例如,我有一个方法。它返回一个Q承诺。 我希望一次生成的进程不超过5个,但是对于调用代码是透明的。 我需要实现的是带有签名的功能 我可以这样称呼 我已经开始处理我的版本,但是我想知道是否有人可以检查一个简洁的实现。 问题答案: 我有一个库可以为您做到这一点https://github.com/ForbesLindesay/throat 您可以通过brow
问题内容: 假设我们有很多链接可供下载,并且每个链接可能花费不同的时间来下载。而且我只能使用最多3个连接进行下载。现在,我想确保使用asyncio有效地做到这一点。 这是我要实现的目标:在任何时间点,请尝试确保至少运行3个下载。 数字代表下载链接,连字符代表等待下载。 这是我现在正在使用的代码 输出是预期的: 但是这是我的问题: 目前,我只是在等待9秒钟以使主要功能保持运行状态,直到下载完成。在退
我们的团队正在开始学习fp-ts,我们从一些基本的异步示例开始(大部分是从这里拉出来的)。按顺序运行一组任务很棒,看起来像问题是,在fp-ts中执行并行任务时限制并发的惯用方法是什么?例如,Promise.map(在蓝鸟中)允许您设置像这样的并发限制。 一种解决方案可能是将数组拆分为块,然后使用序列和平面图迭代这些块。然而,这意味着每个区块中的每个任务都必须完成,然后才能进入下一个区块-一个长时间
我需要限制使用weblogic登录我的web应用的用户数量。 找到的解决方案是oracle documents“weblogic.http.session.maxConcurrentRequest属性限制会话的并发请求数。如果给定会话的并发请求数超过指定值,servlet容器将开始拒绝请求。默认情况下,此属性设置为-1,这表示servlet容器不施加任何限制。” 但不知道在哪里或如何设置这些设置。
问题内容: 我得到了这个servlet,它将pdf文件返回到客户端Web浏览器。我们不希望冒任何风险,即当请求数量过多时,服务器将瘫痪。 我们希望采用一种应用程序级别(程序)的方式来设置并发请求数的限制,并在达到限制时向浏览器返回错误消息。我们需要在审批级别进行操作,因为我们在开发级别(tomcat)和生产级别(websphere)具有不同的servlet容器。 我必须强调,我想控制最大请求数,而