登录
首页 >  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 

所以问题是,如果我关闭它是错误的,如果我不关闭 - 它仍然是错误的(参见代码中的注释)。

现在,解决方案将是一个带外信号通道,所有生产者都写入:

package main

import (
  "fmt"
  "math/rand"
)

func producer(c chan int, signal chan bool) {
  success := rand.Float32() > 0.5
  if success {
    c 

这完全符合我的要求!但对我来说,这似乎是一口。我的问题是:是否有任何成语/技巧可以让我以更简单的方式做类似的事情?

我在这里看了一下:http: //golang.org/doc/codewalk/sharemem/ 似乎completechan (在开头初始化main)在一个范围内使用但从未关闭。我不明白怎么做。

如果有人有任何见解,我将不胜感激。干杯!


编辑:fls0815 有答案,并且还回答了无关闭通道范围如何工作的问题。

我上面的代码修改为工作(在 fls0815 提供代码之前完成):

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 

正确答案

只有生产者才能关闭频道。range您可以通过调用消费者来实现您的目标,消费者在您的生产者启动后在结果通道上迭代 ( )。在您的主线程中,您等待(参见 参考资料sync.WaitGroup)直到您的消费者/生产者完成他们的工作。生产者完成后,您关闭生成的通道,这将迫使您的消费者退出(range当通道关闭且没有缓冲项目时将退出)。

示例代码:

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 

我将close- 语句放入 main 函数的原因是因为我们有多个生产者。在上面的示例中关闭一个生产者中的通道会导致您已经遇到的问题(在关闭的通道上写入;原因是可能剩下一个生产者仍在生产数据)。只有在没有生产者时才应关闭频道(因此我建议仅由生产者关闭频道)。这就是在 Go 中构建通道的方式。在这里,您将找到有关关闭频道的更多信息。


与 sharemem 示例相关:AFAICS 此示例通过一次又一次地重新排队资源(从挂起 -> 完成 -> 挂起 -> 完成......等等)来无限运行。这就是 main-func 末尾的迭代所做的。它接收完成的资源并使用 Resource.Sleep() 将它们重新排队以待处理。当没有完成的资源时,它会等待并阻塞新资源的完成。因此无需关闭通道,因为它们一直在使用。

今天关于《Go 中生产者/消费者最简洁的成语是什么?》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

声明:本文转载于:Golang技术栈 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>