Nodejs-redis方法BLPOP阻止事件循环



我使用库节点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将被阻止,直到弹出一个元素。此时,事件循环将运行其他异步函数。但是,我的程序在被阻止,永远等待blpopAsync

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


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

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

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

最新更新