Skip to content

Instantly share code, notes, and snippets.

@alexisvisco
Created October 15, 2018 08:28
Show Gist options
  • Save alexisvisco/b785ca8c6cd4838fbf4416aa0b62ff99 to your computer and use it in GitHub Desktop.
Save alexisvisco/b785ca8c6cd4838fbf4416aa0b62ff99 to your computer and use it in GitHub Desktop.
use std::sync::mpsc;
use std::thread;
use std::time::Duration;
use std::sync::Arc;
use std::sync::Mutex;
use std::clone;
use std::sync::mpsc::Sender;
struct JobStatus {
jobs_completed: u32,
}
impl clone::Clone for JobStatus {
fn clone(&self) -> Self {
return JobStatus {
jobs_completed: self.jobs_completed
}
}
}
fn main() {
let status = Arc::new(Mutex::new(JobStatus { jobs_completed: 0 }));
let (tx, rx) = mpsc::channel();
job(status, tx);
for job in rx.iter() {
if job.jobs_completed < 10 {
println!("waiting {}", job.jobs_completed)
} else {
break
}
}
}
fn job(status: Arc<Mutex<JobStatus>>, tx: Sender<JobStatus>) {
thread::spawn(move || {
for _ in 0..10 {
thread::sleep(Duration::from_millis(250));
let mut job = status.lock().unwrap();
job.jobs_completed += 1;
tx.send(job.clone()).unwrap();
}
});
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment