预生成 "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。
我使用 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。