当前位置: 首页 > 面试题库 >

如何限制Q许诺并发?

邵繁
2023-03-14
问题内容

如何编写限制Q许诺并发的方法?

例如,我有一个方法spawnProcess。它返回一个Q承诺。
我希望一次生成的进程不超过5个,但是对于调用代码是透明的。

我需要实现的是带有签名的功能

function limitConcurrency(promiseFactory, limit)

我可以这样称呼

spawnProcess = limitConcurrency(spawnProcess, 5);

// use spawnProcess as usual

我已经开始处理我的版本,但是我想知道是否有人可以检查一个简洁的实现。


问题答案:

我有一个库可以为您做到这一点https://github.com/ForbesLindesay/throat

您可以通过browserify使用它,也可以从brcdn(https://www.brcdn.org/?module=throat&version=latest)下载独立的版本,并将其添加为脚本标记。

然后(假设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));
  }
}

您可以直接致电throat(promiseFactory, limit),但会返回一个承诺承诺而不是Q承诺。

我也非常喜欢将它与array.map一起使用。

// only allow 3 parallel downloads
var downloadedItems = Q.all(items.map(throat(download, 3)));


 类似资料:
  • 问题内容: 所以我在angularjs服务器中有一个方法,该方法正在调用为数组中的每个方法返回promise的方法。我正在使用下划线_each遍历数组。我想等到整个数组都处理完后再在方法中调用代码的最后一行。 所以… 这当然是行不通的。.循环完成,并在为每个项目完成makeStuffCooler之前调用“ ShowAllMyCoolStuff”。那么..与async方法交互的正确方法是什么,这样我

  • 可能有助于为这个问题提供一点背景上下文:我正在构建一个角服务,它有助于将多部分表单数据(mp4视频)块上传到云中的存储服务。 我试图限制同时发生的未解决promise(chunk data请求)的数量。我使用的是侦听正在解析的所有区块上载promise,然后在发生这种情况时返回异步调用(以完成文件)。我认为我的算法遇到了竞争条件,因为在为具有大量块的文件安排所有作业之前被调用,但在较小的文件中成功

  • 有没有办法限制节点js中一次执行的并发Qpromise的数量? 我正在构建一个web scraper,它必须请求并解析3000多个页面,并且在没有限制的情况下,我提出的一些请求没有及时响应,因此连接停止,所需的响应(html代码)变得不可用。 为了解决这个问题,我发现限制请求的数量可以解决我的问题。 我曾尝试过以下方法,但均无效: Qpromise中的并发限制-节点 我需要请求一个URL数组,一次

  • 如何编写限制Qpromise并发的方法? 例如,我有一个方法。 我希望一次生成不超过5个进程,但对调用代码是透明的。 我需要实现的是一个带有签名的函数 我可以这样称呼他 我已经开始编写我的版本,但我想知道是否有人有一个简洁的实现,我可以对照它进行检查。

  • 问题内容: 这是一些基于行为的简单问题,我在下面的示例中在节点上运行时注意到了这些行为: 输出为: 1)为什么要实现在立即对已知值运行回调之前等待?为什么不够智能,以至于第一行在第二行运行之前同步发布其输出? 2)什么是之间的时间流逝和被输出?它是单个进程滴答吗? 3)能否将绩效深深包裹在承诺中而产生绩效问题?例如,即使可以有效地同步解决,它是否也要异步等待3倍的时间才能完成? 问题答案: 这实际

  • 我们的团队正在开始学习fp-ts,我们从一些基本的异步示例开始(大部分是从这里拉出来的)。按顺序运行一组任务很棒,看起来像问题是,在fp-ts中执行并行任务时限制并发的惯用方法是什么?例如,Promise.map(在蓝鸟中)允许您设置像这样的并发限制。 一种解决方案可能是将数组拆分为块,然后使用序列和平面图迭代这些块。然而,这意味着每个区块中的每个任务都必须完成,然后才能进入下一个区块-一个长时间