pub fn runtime(num_threads: usize) -> anyhow::Result<tokio::runtime::Runtime> {
Ok(tokio::runtime::Builder::new_multi_thread()
.worker_threads(num_threads)
.build()?)
}
pub fn runtime_with<F>(num_threads: usize, f: F) -> anyhow::Result<tokio::runtime::Runtime>
where
F: FnOnce(&mut tokio::runtime::Builder),
{
let mut builder = tokio::runtime::Builder::new_multi_thread();
builder.worker_threads(num_threads);
f(&mut builder);
Ok(builder.build()?)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_runtimes() {
for num_threads in [1, 2, 4, 8] {
let rt = runtime(num_threads).unwrap();
let metrics = rt.metrics();
assert_eq!(metrics.num_workers(), num_threads);
}
}
#[test]
fn test_runtime_with_threads() {
for num_threads in [1, 2, 4, 8] {
let rt = runtime_with(num_threads, |_| {}).unwrap();
let metrics = rt.metrics();
assert_eq!(metrics.num_workers(), num_threads);
}
}
#[test]
fn test_runtime_with_customizes_builder() {
let rt = runtime_with(2, |builder| {
builder.thread_name("custom-worker");
})
.unwrap();
assert_eq!(rt.metrics().num_workers(), 2);
let name = rt.block_on(async {
tokio::task::spawn(async { std::thread::current().name().unwrap_or("").to_string() })
.await
.unwrap()
});
assert!(
name.starts_with("custom-worker"),
"expected thread name starting with 'custom-worker', got '{name}'",
);
}
}