diff --git a/crates/eval/src/eval.rs b/crates/eval/src/eval.rs index cee7a36a34..1e1da15464 100644 --- a/crates/eval/src/eval.rs +++ b/crates/eval/src/eval.rs @@ -10,6 +10,7 @@ use anyhow::{Result, anyhow}; use clap::Parser; use extension::ExtensionHostProxy; use futures::future; +use futures::stream::StreamExt; use gpui::http_client::{Uri, read_proxy_from_env}; use gpui::{App, AppContext, Application, AsyncApp, Entity, SemanticVersion, Task, UpdateGlobal}; use gpui_tokio::Tokio; @@ -46,6 +47,9 @@ struct Args { /// How many times to run the judge on each example run. #[arg(long, default_value = "3")] judge_repetitions: u32, + /// Maximum number of examples to run concurrently. + #[arg(long, default_value = "10")] + concurrency: usize, } fn main() { @@ -217,22 +221,25 @@ fn main() { } let judge_repetitions = args.judge_repetitions; + let concurrency = args.concurrency; + let tasks = examples .into_iter() .map(|example| { let app_state = app_state.clone(); let model = model.clone(); cx.spawn(async move |cx| { - ( - run_example(&example, model, app_state, judge_repetitions, cx).await, - example, - ) + let result = + run_example(&example, model, app_state, judge_repetitions, cx).await; + (result, example) }) }) .collect::>(); - let results: Vec<(Result>>, Example)> = - future::join_all(tasks).await; + let results = futures::stream::iter(tasks) + .buffer_unordered(concurrency) + .collect::>>, Example)>>() + .await; println!("\n\n"); println!("========================================");