@ -3,14 +3,13 @@
> [ch16-02-message-passing.md ](https://github.com/rust-lang/book/blob/master/src/ch16-02-message-passing.md ) > < br >
> commit 26565efc3f62d9dacb7c2c6d0f5974360e459493
一个日益流行的确保安全并发的方式是 ** 消息传递**( _message passing_) , 这里线程或 actor 通过发送包含数据的消息来相互沟通。这个思想来源于 [Go 编程语言文档中 ](http://golang.org/doc/effective_go.html ) 的口号: “不要共享内存来通讯; 而是要通讯来共享内存。”( “Do not communicate by
sharing memory; instead, share memory by communicating.”)
一个日益流行的确保安全并发的方式是 ** 消息传递**( _message passing_) , 这里线程或 actor 通过发送包含数据的消息来相互沟通。这个思想来源于 [Go 编程语言文档中 ](http://golang.org/doc/effective_go.html ) 的口号: “不要共享内存来通讯; 而是要通讯来共享内存。”( “Do not communicate by sharing memory; instead, share memory by communicating.”)
Rust 中一个实现消息传递并发的主要工具是 ** 通道**( _channel_) , 一个 Rust 标准库提供了其实现的编程概念。你可以将其想象为一个水流的通道,比如河流或小溪。如果你将诸如橡皮鸭或小船之类的东西放入其中,它们会顺流而下到达下游。
编程中的通道有两部分组成, 一个发送者( transmitter) 和一个接收者( receiver) 。发送者一端 位于上游位置,在这里可以将橡皮鸭放入河中,接收者部分则位于下游,橡皮鸭最终会漂流至此。代码中的一部分调用发送者的方法以及希望发送的数据,另一部分则检查接收端收到到达 的消息。当发送者或接收者任一被丢弃时可以认为通道被 ** 关闭**( _closed_) 了
编程中的通道有两部分组成, 一个发送者( transmitter) 和一个接收者( receiver) 。发送者位于上游位置, 在这里可以将橡皮鸭放入河中, 接收者部分则位于下游, 橡皮鸭最终会漂流至此。代码中的一部分调用发送者的方法以及希望发送的数据, 另一部分则检查接收端收到的消息。当发送者或接收者任一被丢弃时可以认为通道被 ** 关闭**( _closed_) 了。
这里,我们将开发一个程序,它会在一个线程生成值向通道发送,而在另一个线程会接收值并打印出来。这里会通过通道在线程间发送简单值来演示这个功能。一旦你熟悉了这项技术,就能使用通道来实现聊天系统或利用很多线程进行分布式计算并将部分计算结果发送给一个线程进行聚合。
这里,我们将开发一个程序,它会在一个线程生成值向通道发送,而在另一个线程会接收值并打印出来。这里会通过通道在线程间发送简单值来演示这个功能。一旦你熟悉了这项技术,就能使用通道来实现聊天系统, 或利用很多线程进行分布式计算并将部分计算结果发送给一个线程进行聚合。
首先,在示例 16-6 中,创建了一个通道但没有做任何事。注意这还不能编译,因为 Rust 不知道我们想要在通道中发送什么类型:
@ -30,7 +29,7 @@ fn main() {
`mpsc::channel` 函数返回一个元组:第一个元素是发送端,而第二个元素是接收端。由于历史原因,`tx` 和 `rx` 通常作为 ** 发送者**( _transmitter_) 和 ** 接收者**( _receiver_) 的缩写, 所以这就是我们将用来绑定这两端变量的名字。这里使用了一个 `let` 语句和模式来解构了此元组;第十八章会讨论 `let` 语句中的模式和解构。如此使用 `let` 语句是一个方便提取 `mpsc::channel` 返回的元组中一部分的手段。
让我们将发送端移动到一个新建线程中并发送一个字符串,这样新建线程就可以和主线程通讯了,如示例 16-7 所示。这类似与 在河的上游扔下一只橡皮鸭或从一个线程向另一个线程发送聊天信息:
让我们将发送端移动到一个新建线程中并发送一个字符串,这样新建线程就可以和主线程通讯了,如示例 16-7 所示。这类似于 在河的上游扔下一只橡皮鸭或从一个线程向另一个线程发送聊天信息:
< span class = "filename" > 文件名: src/main.rs< / span >