use majra::queue::{
JobState, ManagedQueue, ManagedQueueConfig, Priority, ResourcePool, ResourceReq,
};
use std::time::Duration;
#[tokio::main]
async fn main() {
let config = ManagedQueueConfig {
max_concurrency: 2,
finished_ttl: Duration::from_secs(60),
};
let queue = ManagedQueue::new(config);
let mut events = queue.subscribe_events();
let big_job = queue
.enqueue(
Priority::High,
"train-llama-70b".to_string(),
Some(ResourceReq {
gpu_count: 4,
vram_mb: 80_000,
}),
)
.await;
let small_job = queue
.enqueue(
Priority::Normal,
"train-phi-3".to_string(),
Some(ResourceReq {
gpu_count: 1,
vram_mb: 8_000,
}),
)
.await;
let _no_gpu_job = queue
.enqueue(Priority::Low, "index-dataset".to_string(), None)
.await;
println!("Queued {} jobs", queue.queued_count().await);
let pool = ResourcePool {
gpu_count: 1,
vram_mb: 16_000,
};
if let Some(item) = queue.dequeue(&pool).await {
println!("Started: {} ({})", item.payload, item.id);
assert_eq!(item.state, JobState::Running);
}
if let Some(item) = queue.dequeue(&pool).await {
println!("Started: {} ({})", item.payload, item.id);
}
assert!(queue.dequeue(&pool).await.is_none());
println!(
"Max concurrency reached ({} running)",
queue.running_count()
);
queue.complete(small_job).unwrap();
println!("Completed small_job");
if let Some(item) = queue.dequeue(&pool).await {
println!("Started: {} ({})", item.payload, item.id);
queue.complete(item.id).unwrap();
}
while let Ok(event) = events.try_recv() {
println!("Event: {event:?}");
}
queue.cancel(big_job).await.unwrap();
println!("Cancelled big_job");
println!(
"Final state: {} queued, {} running, {} total tracked",
queue.queued_count().await,
queue.running_count(),
queue.job_count(),
);
}