#rust #actix-web
#Ржавчина #actix-web
Вопрос:
В настоящее время я внедряю сервер с использованием Rust и Actix-Web. Теперь моя задача — отправлять запрос (ping-запрос) с этого сервера на другой сервер каждые 10 секунд. Сам запрос ping реализован в async
функции:
async fn ping(client: web::Data<Client>, state: Data<AppState>) -> Result<HttpResponse, Error> {}
Это моя простая серверная основная функция:
#[actix_rt::main]
async fn main() -> std::io::Result<()> {
::std::env::set_var("RUST_LOG", "debug");
env_logger::init();
let args = config::CliOptions::from_args();
let config =
config::Config::new(args.config_file.as_path()).expect("Failed to config");
let address = config.address.clone();
let app_state = AppState::new(config).unwrap();
println!("Started http server: http://{}", address);
HttpServer::new(move || {
App::new()
.data(app_state.clone())
.app_data(app_state.clone())
.data(Client::default())
.default_service(web::resource("/").route(web::get().to(index)))
})
.bind(address)?
.run()
.await
}
Я пытался использовать tokio
, но это было слишком сложно, потому что все разные асинхронные функции и их время жизни.
Итак, есть ли какой-нибудь простой способ в actix-web выполнять эту функцию ping (возможно, как службу) каждые 10 секунд после запуска сервера?
Спасибо!
Комментарии:
1. Используется
actix::spawn
для запуска задачи, которая используетtokio::time::delay_for
в цикле ожидание 10 секунд и выполнение запроса?2. Также существует
run_interval
функция, которая «периодически запускает задание для выполнения данного закрытия с заданным фиксированным интервалом».
Ответ №1:
См. actix_rt::spawn
и actix_rt::time::interval
.
Вот пример:
spawn(async move {
let mut interval = time::interval(Duration::from_secs(10));
loop {
interval.tick().await;
// do something
}
});
Ответ №2:
#[get("/run_c")]
async fn run_c() -> impl Responder {
//tokio::time::delay_until(Duration::from_secs(5)).await;
//time::interval(period)
let mut interval = time::interval(Duration::from_millis(10));
loop {
interval.tick().await;
print!("hello");
HttpResponse::Ok().body("Hello world!");
}
}
Это работает, но единственное, что он не будет возвращать http-ответ вызывающему