栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Go中生产者/消费者最容易理解的成语是什么?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Go中生产者/消费者最容易理解的成语是什么?

只有生产者应该关闭渠道。您可以通过

range
在创建生产商之后调用在结果通道上进行迭代()的消费者来实现您的目标。在您的主线程中,您等待(请参阅
sync.WaitGroup
),直到您的消费者/生产者完成工作为止。生产者完成后,您关闭生成的通道,这将迫使您的消费者退出(
range
在通道关闭且没有剩余缓冲项目时退出)。

示例代码:

package mainimport (    "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 <- rand.Int()    }}var resultingChannel = make(chan int)var producer_wg sync.WaitGroupvar consumer_wg sync.WaitGroupfunc main() {    rand.Seed(time.Now().Unix())    for c := 0; c < runtime.NumCPU(); c++ {        producer_wg.Add(1)          go producer()    }    for c := 0; c < runtime.NumCPU(); c++ {        consumer_wg.Add(1)        go consumer()    }    producer_wg.Wait()    close(resultingChannel)    consumer_wg.Wait()}

我将

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


与sharemem示例相关:AFAICS通过一次又一次地对资源进行排队(从挂起->完整->挂起->完整…依次类推),使该示例无休止地运行。这就是main-
func末尾的迭代。它接收完成的资源,并使用Resource.Sleep()将它们重新排队以待处理。当没有完成的资源时,它将等待并阻止新资源完成。因此,由于通道一直在使用中,因此无需关闭通道。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/573514.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号