go - 这个 goroutine 如何持续运行(它是如何工作的)?
问题描述
我对 goroutine 的基本理解是它是一种创建线程的简化方法。
查看confluent-kafka-go库,以以下代码为例:
go func() {
for e := range p.Events() {
switch ev := e.(type) {
case *kafka.Message:
if ev.TopicPartition.Error != nil {
fmt.Printf("Delivery failed: %v\n", ev.TopicPartition)
} else {
fmt.Printf("Delivered message to %v\n", ev.TopicPartition)
}
}
}
}()
// Produce messages to topic (asynchronously)
topic := "myTopic"
for _, word := range []string{"Welcome", "to", "the", "Confluent", "Kafka", "Golang", "client"} {
p.Produce(&kafka.Message{
TopicPartition: kafka.TopicPartition{Topic: &topic, Partition: kafka.PartitionAny},
Value: []byte(word),
}, nil)
}
这是如何工作的?它会不会只运行一次并在遍历所有内容后停止工作p.Events()
?如何go
知道不中止 goroutine 而是继续轮询p.Events()
——即使它在大多数情况下都是空的?
解决方案
根据文档Producer.Events()
,它返回一个频道。
仅当通道关闭时,对通道的测距才会终止。有关详细信息,请参阅Go 之旅。
推荐阅读
- r - 如何为多元时间序列的 Johansen 协整检验制作循环并在 Rstudio 中获得所有可能的组合?
- java - 如何通过自动生成的 PK 使用 Redisson 直写缓存策略
- flutter - 如何避免在颤振中重绘?
- svg - 在 webpack 中解析 SVG
- javascript - Enzime:等待上下文更新以开始执行测试
- django - 触发验证错误时如何更改序列化程序字段名称
- ios - 构建目标依赖项时 Xcode 11.4 存档失败
- javascript - 如果“href”方向没有文件,如何隐藏整个跨度
- javascript - Formik React 使用 2 个按钮(提交和保存)提交表单 - 保存按钮不触发验证
- mysql - 在 MySQL 存储过程中使用 Prepared-Statement 进行多个插入查询