当前位置:   article > 正文

RUST——使用消息传递方式在线程之间传递数据_rust 怎么转发请求

rust 怎么转发请求

管道的使用

在rust中我们使用管道来实现线程之间的通信,rust中的管道实现为标准库中的channel。

示例代码如下:

  1. use std::sync::mpsc;
  2. use std::thread;
  3. fn main() {
  4. let (tx, rx) = mpsc::channel();
  5. thread::spawn(move || {
  6. let val = String::from("hi");
  7. tx.send(val).unwrap();
  8. });
  9. let received = rx.recv().unwrap();
  10. println!("Got: {}", received);
  11. }

我们使用了mpsc库中的channel函数来创建管道,mpsc的含义是multi producer single consumer,即多生产者单消费者。其中channel函数返回的tx表示管道发送端,rx表示管道的接收端。send方法即为数据的发送方法,revc即是数据的接收方法。

管道和所有权的转移

当我们使用send方法发送数据之后,数据的所有权便发生了转移。

我们看如下示例代码:

  1. use std::sync::mpsc;
  2. use std::thread;
  3. fn main() {
  4. let (tx, rx) = mpsc::channel();
  5. thread::spawn(move || {
  6. let val = String::from("hi");
  7. tx.send(val).unwrap();
  8. println!("val is {}", val);
  9. });
  10. let received = rx.recv().unwrap();
  11. println!("Got: {}", received);
  12. }

如果我们编译上述代码,会得到如下的结果:

  1. Compiling thread_channel_demo v0.1.0 (E:\CLionProjects\thread_channel_demo)
  2. error[E0382]: borrow of moved value: `val`
  3. --> src\main.rs:11:31
  4. |
  5. 9 | let val = String::from("hi");
  6. | --- move occurs because `val` has type `String`, which does not implement the `Copy` trait
  7. 10 | tx.send(val).unwrap();
  8. | --- value moved here
  9. 11 | println!("val is {}", val);
  10. | ^^^ value borrowed here after move
  11. For more information about this error, try `rustc --explain E0382`.
  12. error: could not compile `thread_channel_demo` due to previous error

通过以上的结果可以看出,在用send方法把val发送出去之后,如果再调用println方法的时候,由于val的所有权已经发生转移,所以无法通过rust编译器的所有权检查。

使用管道连续发送多个值

在使用recv方法接收数据的时候,在管道中没有数据的时候recv方法会阻塞执行线程,等待接收数据。

示例代码如下:

  1. use std::sync::mpsc;
  2. use std::thread;
  3. use std::time::Duration;
  4. fn main() {
  5. let (tx, rx) = mpsc::channel();
  6. thread::spawn(move || {
  7. let vals = vec![
  8. String::from("hi"),
  9. String::from("from"),
  10. String::from("the"),
  11. String::from("thread"),
  12. ];
  13. for val in vals {
  14. tx.send(val).unwrap();
  15. thread::sleep(Duration::from_secs(1));
  16. }
  17. });
  18. for received in rx {
  19. println!("Got: {}", received);
  20. }
  21. }

在上述示例代码中,子线程和主线程会交替执行,随着数据发送和接收。

我们使用迭代遍历的方式,从rx中接收多个数据。

多个发送端的管道

我们可以使用clone方法,来创建多个发送端,即tx。

示例代码如下:

  1. use std::sync::mpsc;
  2. use std::{thread, vec};
  3. use std::time::Duration;
  4. fn main() {
  5. let (tx, rx) = mpsc::channel();
  6. let tx1 = tx.clone();
  7. thread::spawn(move || {
  8. let vals = vec![
  9. String::from("hi"),
  10. String::from("from"),
  11. String::from("the"),
  12. String::from("thread"),
  13. ];
  14. for val in vals {
  15. tx1.send(val).unwrap();
  16. thread::sleep(Duration::from_secs(1));
  17. }
  18. });
  19. thread::spawn(move || {
  20. let vals = vec![
  21. String::from("more"),
  22. String::from("messages"),
  23. String::from("for"),
  24. String::from("you"),
  25. ];
  26. for val in vals {
  27. tx.send(val).unwrap();
  28. thread::sleep(Duration::from_secs(1));
  29. }
  30. });
  31. for recevied in rx {
  32. println!("Got: {}", recevied);
  33. }
  34. }

我们使用clone方法创建多个tx的实例,来实现多个生产者发送数据。

执行结果如下:

  1. Got: hi
  2. Got: more
  3. Got: from
  4. Got: messages
  5. Got: the
  6. Got: for
  7. Got: thread
  8. Got: you

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/909641
推荐阅读
相关标签
  

闽ICP备14008679号