预生成 "queue" 大量数据以立即在 actix-web 端点中获取它

Pre-generating a "queue" of heavy data to get it immediately in actix-web endpoint

我使用 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还是crossbeam mpmc(后者更方便,因为你可以clone端点).通过正确的缓冲,生产者线程只是循环生成条目,一旦通道“满”,生产者将在发送额外条目(第 21 个或其他)时被阻止。

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