登录
首页 >  Golang >  Go问答

Go 中生产者/消费者最简洁的成语是什么?

来源:Golang技术栈

时间:2023-04-05 16:29:56 334浏览 收藏

欢迎各位小伙伴来到golang学习网,相聚于此都是缘哈哈哈!今天我给大家带来《Go 中生产者/消费者最简洁的成语是什么?》,这篇文章主要讲到golang等等知识,如果你对Golang相关的知识非常感兴趣或者正在自学,都可以关注我,我会持续更新相关文章!当然,有什么建议也欢迎在评论留言提出!一起学习!

问题内容

我想做的是拥有一组生产者 goroutine(其中一些可能完成也可能不完成)和一个消费者例程。问题在于括号中的警告 - 我们不知道将返回答案的总数。

所以我想做的是:

package main

import (
  "fmt"
  "math/rand"
)

func producer(c chan int) {
  // May or may not produce.
  success := rand.Float32() > 0.5
  if success {
    c 
<p>所以问题是,如果我关闭它是错误的,如果我不关闭 - 它仍然是错误的(参见代码中的注释)。</p>
<p>现在,解决方案将是一个带外信号通道,所有生产者都写入:</p>
<pre class="brush:go;toolbar:false">package main

import (
  "fmt"
  "math/rand"
)

func producer(c chan int, signal chan bool) {
  success := rand.Float32() > 0.5
  if success {
    c 
<p>这完全符合我的要求!但对我来说,这似乎是一口。我的问题是:是否有任何成语/技巧可以让我以更简单的方式做类似的事情?</p>
<p>我在这里看了一下:http:
//golang.org/doc/codewalk/sharemem/
似乎<code>complete</code>chan (在开头初始化<code>main</code>)在一个范围内使用但从未关闭。我不明白怎么做。</p>
<p>如果有人有任何见解,我将不胜感激。干杯!</p>
<hr><p>编辑:fls0815 有答案,并且还回答了无关闭通道范围如何工作的问题。</p>
<p>我上面的代码修改为工作(在 fls0815 提供代码之前完成):</p>
<pre class="brush:go;toolbar:false">package main

import (
  "fmt"
  "math/rand"
  "sync"
)

var wg_prod sync.WaitGroup
var wg_cons sync.WaitGroup

func producer(c chan int) {
  success := rand.Float32() > 0.5
  if success {
    c 
<h2 class="daan">
    正确答案
</h2>
<p>只有生产者才能关闭频道。<code>range</code>您可以通过调用消费者来实现您的目标,消费者在您的生产者启动后在结果通道上迭代 ( )。在您的主线程中,您等待(参见
参考资料<code>sync.WaitGroup</code>)直到您的消费者/生产者完成他们的工作。生产者完成后,您关闭生成的通道,这将迫使您的消费者退出(<code>range</code>当通道关闭且没有缓冲项目时将退出)。</p>
<p>示例代码:</p>
<pre class="brush:go;toolbar:false">package main

import (
    "log"
    "sync"
    "time"
    "math/rand"
    "runtime"
)

func consumer() {
    defer consumer_wg.Done()

    for item := range resultingChannel {
        log.Println("Consumed:", item)
    }
}

func producer() {
    defer producer_wg.Done()

    success := rand.Float32() > 0.5
    if success {
        resultingChannel 
<p>我将<code>close</code>- 语句放入 main
函数的原因是因为我们有多个生产者。在上面的示例中关闭一个生产者中的通道会导致您已经遇到的问题(在关闭的通道上写入;原因是可能剩下一个生产者仍在生产数据)。只有在没有生产者时才应关闭频道(因此我建议仅由生产者关闭频道)。这就是在
Go 中构建通道的方式。<a target='_blank'  href='https://www.17golang.com/gourl/?redirect=MDAwMDAwMDAwML57hpSHp6VpkrqbYLx2eayza4KafaOkbLS3zqSBrJvPsa5_0Ia6sWuR4Juaq6t9nq5roGCUgXpusdyfppZkr83GoZTZmpaup4SZcqK8q2mdyZCko5SApa2x3LSilnlw376Hfs6B3LGjkq2FYLF2cWS_jaNgin2CsLOVsKKBnKKZs4iZ0IXdyKOF4H6csIl9Zr6zo20' rel='nofollow'>在这里</a>,您将找到有关关闭频道的更多信息。</p>
<hr><p>与 sharemem 示例相关:AFAICS 此示例通过一次又一次地重新排队资源(从挂起 -> 完成 -> 挂起 ->
完成......等等)来无限运行。这就是 main-func 末尾的迭代所做的。它接收完成的资源并使用 Resource.Sleep()
将它们重新排队以待处理。当没有完成的资源时,它会等待并阻塞新资源的完成。因此无需关闭通道,因为它们一直在使用。</p><p>今天关于《Go 中生产者/消费者最简洁的成语是什么?》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!</p>
声明:本文转载于:Golang技术栈 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>