问题描述
我使用 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 个或其他)。
一旦消费者从通道中获取一个条目,生产者将被解锁,添加新条目,生成一个新条目,并等待它可以入队那个。