Javascript 流星。wrapAsync导致100%CPU
一个应用程序正在使用meteor redis包运行redis查询,有时需要30秒才能返回100k个结果。在这段等待时间内,Meteor会冻结并在等待查询结果时占用100%的CPUJavascript 流星。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
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集成感兴趣: