[英]Meteor._wrapAsync causes 100% CPU
一个应用程序正在使用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返回巨大数据集的过程中,流星还可以做其他事情吗? 如果client.zrangebyscore
没有用Meteor._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)
})
}));
流星bindEnvironment与Meteor._wrapAsync几乎一样,只是它缺少等待结果的片段。 似乎您没有使用此位,因为您不希望从client.zrangebyscoreSync
获得结果。 Meteor.bindEnvironment可能更适合此用途,它将回调包装在Fiber中,因此您可以在其中使用Meteor代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.