Skip to content

Instantly share code, notes, and snippets.

@poonai
Last active September 17, 2018 09:21
Show Gist options
  • Save poonai/61f8850233837d7942ab6d9c0fae918e to your computer and use it in GitHub Desktop.
Save poonai/61f8850233837d7942ab6d9c0fae918e to your computer and use it in GitHub Desktop.
simple worker in rust
extern crate chan_signal;
use chan_signal::Signal;
use std::sync::mpsc;
use std::sync::mpsc::{Receiver, Sender};
use std::thread;
enum ReceiveMessage {
Work(Box<Fn() + Send>),
End,
}
struct Worker {
sender: Sender<ReceiveMessage>,
}
impl Worker {
fn start() -> Self {
let (sender, reciver): (Sender<ReceiveMessage>, Receiver<ReceiveMessage>) = mpsc::channel();
thread::spawn(move || loop {
if let Ok(task) = reciver.recv() {
match task {
ReceiveMessage::Work(task) => task(),
ReceiveMessage::End => break,
}
}
});
return Worker { sender };
}
fn execute(&self, task: Box<Fn() + Send>) {
self.sender.send(ReceiveMessage::Work(task));
}
fn stop(&self) {
self.sender.send(ReceiveMessage::End);
}
}
fn main() {
let worker = Worker::start();
worker.execute(Box::new(|| {
println!("{}", "vanakam from worker!");
}));
let signal = chan_signal::notify(&[Signal::INT, Signal::TERM, Signal::HUP]);
signal.recv().unwrap();
// stopping worker
worker.stop();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment