在此代码中,除task_id
外,一切正常。我希望此脚本能够计算task_id
中的请求:
use std::thread;
use std::thread::sleep_ms;
use std::sync::mpsc;
#[macro_use] extern crate nickel;
use nickel::Nickel;
fn main() {
let mut server = Nickel::new();
let mut task_id: i64 = 0;
server.utilize(router! {
get "**" => |_req, _res| {
task_id += 1;
run_heavy_task(task_id);
"Yo!"
}
});
server.listen("127.0.0.1:6767");
}
fn run_heavy_task(task_id: i64) {
let (tx, rx) = mpsc::channel();
thread::spawn(move || {
println!("heavy task {} started!", task_id);
sleep_ms(3000);
println!("heavy task {} completed", task_id);
let result = tx.send(());
});
//rx.recv();
//println!("Task {} completed", task_id);
}
错误:
无法捕捉fn项目中的动态环境;使用|| {...} 关闭形式而不是main.rs:13 task_id + = 1;
请帮我解决这个问题 - 如何将task_id传递给关闭?
答案 0 :(得分:3)
为了扩展Chris Morgan的答案,这是一个包含相同错误的自包含示例:
fn main() {
let mut a = 0;
fn router() {
a += 1;
}
router();
println!("{}", a)
}
问题是fn
项目不允许捕获其环境,期间。捕获环境并非易事,有多种方法可以将变量放入闭包中。闭包实际上是每个捕获变量具有适当成员变量的结构。
回顾Chris Morgan的陈述:
请记住可能是多线程的;至少你需要使用某种形式的互斥来使它工作。
(强调我的)。您正在创建一个功能,但您无法控制如何或何时调用它。如你所知,Nickel可能会选择从多个线程调用它 - 这可以直接到库中。实际上,你不会调用代码task_id += 1
!
我并不是Nickel的专家,但似乎无法使用您发布的代码进行动态路由。但是,您应该可以避免使用宏和construct a handler yourself,只是"只是"需要实施Middleware
。该处理程序可能包含状态,如task_id
。