Rust で記述された同期ソケット コードを、Tokio を使用した同等の非同期コードに置き換えています。Tokio は非同期アクティビティに Future を使用するため、タスクは連鎖され、エグゼキューターのキューに入れられ、スレッド プールによって実行されます。
私がやりたいことの基本的な擬似コードは次のとおりです。
let tokio::net::listener = TcpListener::bind(&sock_addr).unwrap();
let server_task = listener.incoming().for_each(move |socket| {
let in_buf = vec![0u8; 8192];
// TODO this should happen continuously until an error happens
let read_task = tokio::io::read(socket, in_buf).and_then(move |(socket, in_buf, bytes_read)| {
/* ... Logic I want to happen repeatedly as bytes are read ... */
Ok(())
};
tokio::spawn(read_task);
Ok(())
}).map_err(|err| {
error!("Accept error = {:?}", err);
});
tokio::run(server_task);
この疑似コードは、タスクを 1 回だけ実行します。継続的に実行するにはどうすればよいですか?実行してから何度も実行したい. パニックが発生した場合、またはエラー結果コードがある場合にのみ実行を停止したい. それを行う最も簡単な方法は何ですか?