mirror of
https://github.com/unknwon/the-way-to-go_ZH_CN.git
synced 2025-11-13 09:16:10 +08:00
modified: eBook/14.2.md
modified: eBook/14.4.md
This commit is contained in:
@@ -249,7 +249,7 @@ go sum(bigArray, ch) // bigArray puts the calculated sum on ch
|
||||
sum := <- ch // wait for, and retrieve the sum
|
||||
```
|
||||
|
||||
也可以使用通道来达到同步的目的,这个很有效的用法在传统计算机中成为(semaphore)。或者换个方式:通过通道发送信号告知处理已经完成(在协程中)。
|
||||
也可以使用通道来达到同步的目的,这个很有效的用法在传统计算机中称为信号量(semaphore)。或者换个方式:通过通道发送信号告知处理已经完成(在协程中)。
|
||||
|
||||
在其他协程运行时让 main 程序无限阻塞的通常做法是在 `main` 函数的最后放置一个{}。
|
||||
|
||||
@@ -274,7 +274,7 @@ func main(){
|
||||
}
|
||||
```
|
||||
|
||||
这个信号也可以是其他的,不反回结果,比如下边这个协程中的 lambda 函数协程:
|
||||
这个信号也可以是其他的,不返回结果,比如下面这个协程中的匿名函数(lambda)协程:
|
||||
|
||||
```go
|
||||
ch := make(chan int)
|
||||
@@ -302,7 +302,7 @@ go doSort(s[i:])
|
||||
<-done
|
||||
```
|
||||
|
||||
下边的代码,用完整的信号量模式对 size 长度的 gloat64 切片进行了 N 个` doSomething()` 计算并同时完成,通道 sem 分配了相同的长度(切包含空接口类型的元素),待所有的计算都完成后,发送信号(通过放入值)。在循环中从通道 sem 不停的接收数据来等待所有的协程完成。
|
||||
下边的代码,用完整的信号量模式对长度为N的 float64 切片进行了 N 个` doSomething()` 计算并同时完成,通道 sem 分配了相同的长度(切包含空接口类型的元素),待所有的计算都完成后,发送信号(通过放入值)。在循环中从通道 sem 不停的接收数据来等待所有的协程完成。
|
||||
|
||||
```go
|
||||
type Empty interface {}
|
||||
@@ -343,11 +343,11 @@ for i, v := range data {
|
||||
|
||||
信号量是实现互斥锁(排外锁)常见的同步机制,限制对资源的访问,解决读写问题,比如没有实现信号量的 `sync` 的 Go 包,使用带缓冲的通道可以轻松实现:
|
||||
|
||||
- 带缓冲通道的容量和我们要同步的资源容量相同
|
||||
- 通道的长度(当前存放的元素个数)当前资源被使用的数量相同
|
||||
- 带缓冲通道的容量和要同步的资源容量相同
|
||||
- 通道的长度(当前存放的元素个数)与当前资源被使用的数量相同
|
||||
- 容量减去通道的长度就是未处理的资源个数(标准信号量的整数值)
|
||||
|
||||
不用管通道中存放的是什么,只关注长度;因此我们创建了一个有长度变量为 0(字节)的通道:
|
||||
不用管通道中存放的是什么,只关注长度;因此我们创建了一个长度可变但容量为0(字节)的通道:
|
||||
|
||||
```go
|
||||
type Empty interface {}
|
||||
@@ -403,7 +403,7 @@ func (s semaphore) Signal() {
|
||||
|
||||
习惯用法:通道工厂模式
|
||||
|
||||
编程中常见另外一种模式如下:不将通道作为参数传递给协程,而用函数来生成一个通道并返回(工厂角色);函数内有个 lambda 函数被协程调用。
|
||||
编程中常见的另外一种模式如下:不将通道作为参数传递给协程,而用函数来生成一个通道并返回(工厂角色);函数内有个匿名函数被协程调用。
|
||||
|
||||
在 [channel_block2.go](examples/chapter_14/channel_block2.go) 加入这种模式便有了示例 14.5-[channel_idiom.go](examples/chapter_14/channel_idiom.go):
|
||||
|
||||
|
||||
Reference in New Issue
Block a user