预先生成大量数据的“队列”以立即在 actix-web 端点中获取它

问题描述

我使用 actix-web 并希望生成 (password,password hash) 对。
需要一些时间(0.5s)。

而不是按需生成每一对:

pub async fn signup (data: web::Data<AppData>) -> impl Responder {
    // Generate password
    let password = data.password_generator.generate_one().unwrap();
    let password_hash = password::hash_encoded(password.as_bytes());  // 0.5s
    // ...
}

我希望总是预先生成 10-20 个,并且只获得现有的一对。之后在后台生成一个新的。

我如何使用 actix-web 来做到这一点?

我想到了某种重新填充“队列”。但是不知道如何实现并在多个actix线程中正确使用。

解决方法

您可以只使用常规线程(如在 std::thread::spawn 中):虽然 actix 可能具有某种 blocking 设施,可以在调度程序之外执行阻塞功能,但这些通常用于阻塞任务,最终终止。在这里,您想要一些永远存在的东西。因此,stdlib 线程正是您想要的。

然后在两者之间设置一个缓冲的、阻塞的通道,要么是 mpsc 要么是横梁 mpmc(后者更方便,因为您可以 clone 端点)。使用正确的缓冲,生产者线程只会循环生产条目,一旦通道“已满”,生产者将在发送额外条目时被阻塞(第 21 个或其他)。

一旦消费者从通道中获取一个条目,生产者将被解锁,添加新条目,生成一个新条目,并等待它可以入队那个