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

如何有效关闭渠道?

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

如何有效关闭渠道?

这是生产者-
消费者类型的示例。我只使用

WaitGroup
here,这样主goroutine不会立即退出。从理论上讲,您的应用程序可以等待,或者在此期间做一些其他有趣的事情。

请注意,您还可以使用

c := make(chan(*Feed, n))
其中
n
要缓冲编号的缓冲通道。请注意,在典型的生产者-
消费者方案中,有时每个作业分配了很多资源。因此,根据需要,您可以仅缓冲其中的一些缓冲,也可以全部缓冲。

如果没有缓冲通道,它将充当goroutine之间的同步。生产者在

c <-
等待消费者
<- c
交接时阻塞,因此每个例程中只有一个例程一次执行这些行。

编辑 我在打印“开始”之前添加了一个暂停,以使输出不太同步。以前总是输出:

createdstartedcreatedstarted...

https://play.golang.org/p/FmWqegr-CR

package mainimport (    "fmt"    "math/rand"    "sync"    "time")type Feed struct {    title, descr, link string    published          time.Time}func CreateFeed() *Feed {    r := rand.Int() % 500    time.Sleep(1000 + time.Duration(r)*time.Millisecond)    fmt.Println("Feed created")    return &Feed{        published: time.Now(),    }}func UseFeed(f *Feed) {    time.Sleep(100 * time.Millisecond)    fmt.Println("Feed started")    time.Sleep(1600 * time.Millisecond)    fmt.Printf("Feed consumed: %sn", f.published)}func main() {    numFeeds := 10    var wg sync.WaitGroup    wg.Add(10)    c := make(chan (*Feed))    for i := 0; i < numFeeds; i++ {        go func() { c <- CreateFeed() }()    }    for i := 0; i < numFeeds; i++ {        go func() { f := <-c UseFeed(f) wg.Done()        }()    }    wg.Wait()}

我希望这是您想要的。



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

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

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