- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
这是从“Google I/O 2012 - Go Concurrency Patterns”(slides)中获取的代码示例
package main
import (
"fmt"
"time"
)
func main() {
joe := boring("Joe")
ann := boring("Ann")
for i := 0; i < 5; i++ {
fmt.Println(<-joe)
fmt.Println(<-ann)
}
fmt.Println("The end")
}
func boring(msg string) <-chan string {
c := make(chan string)
go func() {
for i := 0; ; i++ {
c <- fmt.Sprintf("%s %d", msg, i)
time.Sleep(time.Second)
}
}()
return c
}
输出:
Joe 0
Ann 0
Joe 1
Ann 1
Joe 2
Ann 2
Joe 3
Ann 3
Joe 4
Ann 4
The end
这是演讲者 Rob Pike 的解释(视频中的 16:33):“......我们正在读取来自 Joe 的值和来自 Ann 的值。并且由于 channel 的同步性质,这两个家伙轮流,不仅打印出值,而且执行它们。因为如果 Ann 准备发送一个值但 Joe 还没有这样做,Ann 仍然会被阻塞,等待传递值到主要。”
这让我很困惑。 “如果 Ann 准备好发送一个值但 Joe 还没有这样做,Ann 仍然会被阻止”是什么意思?正如我们所知, channel 在两个 goroutine 之间建立通信并同步它们的执行。但是我们在这里创建了两个 channel (joe
和 ann
)。主 goroutine 分别通过 joe
和 ann
与两个新的 goroutine 进行对话。这是否意味着同步性质在 channel 之间也有效?或者主 goroutine 一次只能与另一个 goroutine 对话?
最佳答案
它只是表示those channels are unbuffered .
fmt.Println(<-joe)
fmt.Println(<-ann)
在第一行完成之前,第二行将无法执行。
在 joe 的 channel 中写入内容之前,第一个不会完成。
如果 Ann 的 channel 已经有值,则 Ann 将无法写入该 channel 。
在先读取 joe 的 channel ( fmt.Println(<-ann)
) 之前,不会读取该 channel ( fmt.Println(<-joe)
)。
两个 channel 都是独立的(彼此不知道),但是读取操作的顺序性质使得一个 channel 等待另一个 channel 先被读取。
关于go - Rob Pike 在 Go 中的 "the synchronization nature of the channels"是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32153093/
我正在尝试使用 docker-compose 从 docker 内部连接到 rabbitMQ。从容器外运行的程序连接到“image:rabbitmq:3-management”没有问题。 没有设置
什么是 c# 正则表达式来替换开始和结束派克之间的所有文本/字符? 例如: this is an that to turn into => this is an that to turn into
在 Rob Pike 的 2012 年演讲中,Concurrency is not Parallelism (it's better) ,他有一个正在运行的例子,说明一群 gophers 一起工作来焚
配置: Openstack Pike 在 Ubuntu16.04 VM 上使用 devStack 启用插件: 撒哈拉 热火 珍宝 撒哈拉仪表板 Trove 仪表板 安装成功,可以访问horizon
这是从“Google I/O 2012 - Go Concurrency Patterns”(slides)中获取的代码示例 package main import ( "fmt" "
我是一名优秀的程序员,十分优秀!