【问题标题】:Nodejs redis method BLPOP blocks the event-loopNodejs redis 方法 BLPOP 阻塞了事件循环
【发布时间】:2020-10-25 22:11:46
【问题描述】:

我使用库node-redis:https://github.com/NodeRedis/node-redis

let client = redis.createClient();
let blpopAsync = util.promisify(client.blpop).bind(client);
let rpushAsync = util.promisify(client.rpush).bind(client);

async function consume() {
    let data = await blpopAsync('queue', 0); // the program is blocked at here
}

async function otherLongRunningTasks() {
    // call some redis method
    await rpushAsync('queue', data);
}

我希望方法 blpopAsync 将被阻止,直到弹出一个元素。而此时,事件循环将运行其他异步函数。但是,我的程序在 await blpopAsync 处被永久阻止。

你能告诉我如何正确使用这个函数来不阻塞事件循环吗?


我发现blpop阻塞了redis客户端的其他非阻塞方法,所以其他使用redis的函数会永远等待。事件循环仍在运行。

【问题讨论】:

    标签: node.js redis


    【解决方案1】:

    我目前无法发表评论,所以我必须在这里发布。没有数据时 blpop 会阻塞。要考虑的另一件事是 Redis 的版​​本。 blpop 在版本之间的行为不同。可以参考redis文档。

    【讨论】:

    • 感谢您的回复。我刚刚更新了我的问题。
    • 您可以使用 client.duplicate() 允许其他人在 blpop 阻塞时使用连接,并为 blpop 设置超时并相应地处理。
    【解决方案2】:

    正如@AnonyMouze 所说,执行client.duplicate().blpop(...) 是释放连接的诀窍。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-17
      • 1970-01-01
      • 2013-08-16
      • 1970-01-01
      • 2016-04-21
      相关资源
      最近更新 更多