繁体   English   中英

Meteor._wrapAsync导致100%CPU

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM