Guest User

Untitled

a guest
Jun 25th, 2018
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.59 KB | None | 0 0
  1. extern crate rayon;
  2.  
  3. use std::sync::mpsc;
  4. use std::sync::Arc;
  5.  
  6. #[derive(Debug)]
  7. pub struct Output(u32);
  8.  
  9. #[derive(Debug)]
  10. pub struct Message(u32);
  11.  
  12. pub struct Server {
  13. worker_pool: rayon::ThreadPool,
  14. }
  15.  
  16. impl Server {
  17. fn process(&self, tx: &mpsc::Sender<Output>, message: Message) {
  18. // each task needs its own sender, but this is cheap.
  19. let tx = tx.clone();
  20.  
  21. self.worker_pool.spawn(move || {
  22. // do something with message here
  23. tx.send(Output(message.0));
  24. });
  25. }
  26. }
  27.  
  28. fn main() {
  29. use std::thread;
  30.  
  31. let worker_pool = rayon::ThreadPoolBuilder::new().num_threads(4).build().unwrap();
  32. let (tx, rx) = mpsc::channel();
  33.  
  34. let server = Arc::new(Server {
  35. worker_pool
  36. });
  37.  
  38. // first thread sending messages.
  39. let s1 = thread::spawn({
  40. // cheap to clone since Arc.
  41. let server = server.clone();
  42. // each thread needs its own clone of tx.
  43. let tx = tx.clone();
  44.  
  45. move || {
  46. for i in 0u32..1000 {
  47. server.process(&tx, Message(i));
  48. }
  49. }
  50. });
  51.  
  52. // second thread sending messages.
  53. let s2 = thread::spawn({
  54. // cheap to clone since Arc.
  55. let server = server.clone();
  56. // each thread needs its own clone of tx.
  57. let tx = tx.clone();
  58.  
  59. move || {
  60. for i in 1000u32..200 {
  61. server.process(&tx, Message(i));
  62. }
  63. }
  64. });
  65.  
  66. while let Ok(output) = rx.recv() {
  67. println!("output: {:?}", output);
  68. }
  69.  
  70. s1.join().expect("bad thread");
  71. s2.join().expect("bad thread");
  72. }
Add Comment
Please, Sign In to add comment