PHP速学视频免费教程(入门到精通)
PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
我有一个充当侦听器的 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 := <p>问题是我想看到通过该通道的所有内容都打印出来。如果 <code>main</code> 突然结束,可能 <code>arr</code> 中还剩下一些东西还没有打印出来,我就看不到了。所以我需要确保这个goroutine在程序结束之前处理完通道中的所有数据。我认为,这意味着我需要使用 <code>WaitGroup</code> 并使用 <code>Wait()</code> 来确保程序在我的 goroutine 完成需要执行的操作之前不会关闭。 <strong>但我不知道在我的 <code>WaitGroup</code> 上调用 <code>Done()</code> 的位置。</strong></p> <p>基本上,我需要一种安全的方法来在程序结束之前“暂停”goroutine,并打印出剩下的内容。我怎样才能做到这一点?</p> <p>更糟糕的是,对于单元测试之类的事情,我自己将数据发送到通道,在发送一定数量后,我想查看数组。但是,如果我只是在将数据发送到通道的代码之后立即检查数组,则 goroutine 可能还没有机会处理所有数据。在这种情况下,我想等待 goroutine 处理我发送的所有数据,然后我想暂停它并要求它向我显示数组。但我如何知道 goroutine 何时完成处理呢?我可以 <code>sleep</code> 一段时间,给它一个完成的机会,然后停下来看看,但这感觉相当黑客。我认为有一个最佳实践方法可以解决这个问题,但我还没有弄清楚。</p> <p>这是我的一些想法,其中零个有效。</p> <ol> <li> <p>在无限 <code>for</code> 循环之外调用 <code>Done()</code>。这不起作用,因为据我所知,该代码无法访问。</p> </li> <li> <p>在超时<code>case</code>中调用<code>Done()</code>。这是行不通的,因为超时后可能会有更多数据在路上,我希望我的 goroutine 继续监听。</p> </li> </ol><br><h2 class="daan">正确答案</h2><br><p>修改侦听器以在通道关闭时返回。返回时调用 wg.Done():</p> <pre class="brush:php;toolbar:false;">func listener(c chan *myObject, arr []*myObject, wg *sync.WaitGroup) { defer wg.Done() for { select { case value, ok := <p>修改 main 以在发送完成后关闭通道。在从 main 返回之前等待 goroutine 完成。</p> <pre class="brush:php;toolbar:false;">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()
已抢6799个
抢已抢91613个
抢已抢14418个
抢已抢50597个
抢已抢190558个
抢已抢86253个
抢