Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 流星。wrapAsync导致100%CPU_Javascript_Node.js_Meteor_Redis_Node Redis - Fatal编程技术网

Javascript 流星。wrapAsync导致100%CPU

Javascript 流星。wrapAsync导致100%CPU,javascript,node.js,meteor,redis,node-redis,Javascript,Node.js,Meteor,Redis,Node Redis,一个应用程序正在使用meteor redis包运行redis查询,有时需要30秒才能返回100k个结果。在这段等待时间内,Meteor会冻结并在等待查询结果时占用100%的CPU var client = redis.createClient(port, url) client.zrangebyscoreSync = Meteor._wrapAsync(client.zrangebyscore) client.zrangebyscoreSync(['game:scores', '', '+in

一个应用程序正在使用meteor redis包运行redis查询,有时需要30秒才能返回100k个结果。在这段等待时间内,Meteor会冻结并在等待查询结果时占用100%的CPU

var client = redis.createClient(port, url)
client.zrangebyscoreSync = Meteor._wrapAsync(client.zrangebyscore)

client.zrangebyscoreSync(['game:scores', '', '+inf'], function(err, scores) {

    _.each(scores, function(score, player) {
        var doc = { ... }
        Scores.insert(doc)
    })


})
问题:在等待redis返回庞大数据集的同时,是否还可以让Meteor做其他事情?如果
client.zrangebyscore
未使用
Meteor.\u wrapAsync
包装,Meteor将抛出错误

 Error: Meteor code must always run within a Fiber. Try wrapping callbacks that you pass to non-Meteor libraries with Meteor.bindEnvironment.

跟踪将其指向行
Scores.insert(doc)

通常,Meteor将允许运行其他方法,前提是您首先对它们运行
this.unblock()
,从而将这些请求旋转到新的光纤中

您获得100%CPU使用率的原因可能是CPU空闲光纤的种类和下面执行的任务的组合

如果这是一个问题,您可以尝试改用Meteor.bindEnvironment,它不会使用future的等待,并且仍然使用回调来确保所有内容保持畅通:

client.zrangebyscore(['game:scores', '', '+inf'], Meteor.bindEnvironment(function(err, result) {
    _.each(scores, function(score, player) {
        var doc = { ... }
        Scores.insert(doc)
    })
}));

Meteor bindEnvironment与Meteor几乎是一样的东西。\u wrapAsync,只是缺少了等待结果的片段。但看起来您没有使用此位,因为您没有查找来自
client.zrangebyscoreSync
的结果。Meteor.bindEnvironment可能更适合此用途,它将您的回调封装在光纤中,因此您可以在其中使用Meteor代码。

客户端返回的得分
。ZrangeBySCStore正在被
使用。每个
。我们还能使用Meteor.bindEnvironment吗?@Nyxynyx应该没问题。我有点不确定到底是什么让你脱离了光纤(除了setTimeout),我认为它使用的是原生节点方法,比如request、fs等等。如果是类似于forEach的
。更新-刚刚检查了它的源代码,应该没问题,因为它使用
.call
绑定回调,或者在引擎盖下使用
forEach
。由于您正在尝试使用Redis,我想知道您是否对我正在研究的Meteor Redis集成感兴趣: