我有一个充当侦听器的 goroutine。输入流传入某个缓冲的 channel
,我希望我的 goroutine 处理传入该通道的数据。然而,有时 channel
可能会暂时没有数据输入。如果 channel
一秒钟没有什么可提供的,我希望我的 goroutine 做一些不同的事情。该函数如下所示:
func main () { var wg sync.WaitGroup arr := make([]*myObject, 0) wg.Add(1) go listener(c, arr, &wg) for { // sending stuff to c } } func listener(c chan *myObject, arr []*myObject, wg *sync.WaitGroup) { for { select { case value := <- c: arr = append(arr, value) case <- time.After(1 * time.Second): fmt.Println(arr) } }
问题是我想看到通过该通道的所有内容都打印出来。如果 main
突然结束,可能 arr
中还剩下一些东西还没有打印出来,我就看不到了。所以我需要确保这个goroutine在程序结束之前处理完通道中的所有数据。我认为,这意味着我需要使用 WaitGroup
并使用 Wait()
来确保程序在我的 goroutine 完成需要执行的操作之前不会关闭。 但我不知道在我的 WaitGroup
上调用 Done()
的位置。
基本上,我需要一种安全的方法来在程序结束之前“暂停”goroutine,并打印出剩下的内容。我怎样才能做到这一点?
更糟糕的是,对于单元测试之类的事情,我自己将数据发送到通道,在发送一定数量后,我想查看数组。但是,如果我只是在将数据发送到通道的代码之后立即检查数组,则 goroutine 可能还没有机会处理所有数据。在这种情况下,我想等待 goroutine 处理我发送的所有数据,然后我想暂停它并要求它向我显示数组。但我如何知道 goroutine 何时完成处理呢?我可以 sleep
一段时间,给它一个完成的机会,然后停下来看看,但这感觉相当黑客。我认为有一个最佳实践方法可以解决这个问题,但我还没有弄清楚。
这是我的一些想法,其中零个有效。
-
在无限
for
循环之外调用Done()
。这不起作用,因为据我所知,该代码无法访问。 -
在超时
case
中调用Done()
。这是行不通的,因为超时后可能会有更多数据在路上,我希望我的 goroutine 继续监听。
正确答案
修改侦听器以在通道关闭时返回。返回时调用 wg.Done():
func listener(c chan *myObject, arr []*myObject, wg *sync.WaitGroup) { defer wg.Done() for { select { case value, ok := <- c: if !ok { return } arr = append(arr, value) case <- time.After(1 * time.Second): fmt.Println(arr) } }
修改 main 以在发送完成后关闭通道。在从 main 返回之前等待 goroutine 完成。
var wg sync.WaitGroup arr := make([]*myObject, 0) wg.Add(1) go listener(c, arr, &wg) for { // sending stuff to c } close(c) wg.Wait()
以上是终止无限循环 goroutine 的安全方法?的详细内容。更多信息请关注PHP中文网其他相关文章!

Golang在实际应用中表现出色,以简洁、高效和并发性着称。 1)通过Goroutines和Channels实现并发编程,2)利用接口和多态编写灵活代码,3)使用net/http包简化网络编程,4)构建高效并发爬虫,5)通过工具和最佳实践进行调试和优化。

Go语言的核心特性包括垃圾回收、静态链接和并发支持。1.Go语言的并发模型通过goroutine和channel实现高效并发编程。2.接口和多态性通过实现接口方法,使得不同类型可以统一处理。3.基本用法展示了函数定义和调用的高效性。4.高级用法中,切片提供了动态调整大小的强大功能。5.常见错误如竞态条件可以通过gotest-race检测并解决。6.性能优化通过sync.Pool重用对象,减少垃圾回收压力。

Go语言在构建高效且可扩展的系统中表现出色,其优势包括:1.高性能:编译成机器码,运行速度快;2.并发编程:通过goroutines和channels简化多任务处理;3.简洁性:语法简洁,降低学习和维护成本;4.跨平台:支持跨平台编译,方便部署。

关于SQL查询结果排序的疑惑学习SQL的过程中,常常会遇到一些令人困惑的问题。最近,笔者在阅读《MICK-SQL基础�...

golang ...

Go语言中如何对比并处理三个结构体在Go语言编程中,有时需要对比两个结构体的差异,并将这些差异应用到第�...


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

Dreamweaver Mac版
视觉化网页开发工具

螳螂BT
Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

适用于 Eclipse 的 SAP NetWeaver 服务器适配器
将Eclipse与SAP NetWeaver应用服务器集成。

VSCode Windows 64位 下载
微软推出的免费、功能强大的一款IDE编辑器

PhpStorm Mac 版本
最新(2018.2.1 )专业的PHP集成开发工具