Day 15 读 Go Concurrency Patterns - Rob Pike II

续上篇 Day 14 读 Go Concurrency Patterns - Rob Pike I

Restore sequence

基於某种原因,我们有时侯是想要保持顺序,也就是 Joe 和 Ann 两个人各自随机时间印出 0 , 两个人在随几印出 1,以此类推等等。注意:这和上上一次的例子并不一样,那一组例子是 Ann 可能已经准备好了,但是必须等 Joe,现在是 Joe 和 Ann 在随机时间印出之後才等待。

我们可以在 generator (boring function) 传送的讯息中传送一个 Message,里边放一个 channel,并且用这个 channel 控制是否让下一轮的 Message 传送

因此我们将 boring 改写一下,完整程序在这 link

Using select

还记得 fan in 吗?两个 goroutine 同时传送给一个 channel,快的那个会先送出,这不就跟 select 的意思一样吗,select 监听两个 channel,两个 channel 谁先 ready,就走那个 case。那就用 select 改写吧

Timeout using select

接下来我们来想想,boring generator 要怎麽停止传送讯息吧。

在 golang 中 timeout 和 select 也很常一起使用。这个的例子是,boring generator 每次发出的讯息间隔不花超过 1 秒,超过的话就 return。

另一种常见的使用方式是,让 boring function 在一个时间内传送讯息,以下的例子就是在五秒内传送讯息,过了五秒後就 return。

Quit channel

我们也可以设计一个 quit channel 通知 boring generator 不要再继续送讯息

我们通知了 boring generator 着手进行结束的工作,但是我们怎麽知道 boring generator 已经结束了,那就让 boring generator 结束前通知我吧,完整程序可看 link

今天就到这吧,明天就是这演讲的最後一篇。


<<:  周末雨会(四):自定义资料类别 Defined Data Class

>>:  D15 - 如何用 Apps Script 自动化地创造与客制 Google Docs?(二)快速生出大量寄件信封资料

django新手村14-----添加资料

之前在添加资料时,都是手动去资料库添加,这样很不合理,也没有效率 如果只是为了方便,当然可以使用以下...

Day25,Kubeapps一日体验

kubeapps是一个由vmware/bitnami主导的开源项目,主旨为在kubernetes中让...

RISC V::中断与异常处理 -- 异常篇

一般在修读 Operating System 时,都会学习到 Interrupt 的概念,此外,电脑...

【薪资平台】从薪水来看目标公司

如果有人在看,可能会想说,蛤我都还没写履历就要看薪水了?? 就算你的考虑条件中没有薪水这一项,也可以...

Day-20 用 Pytorch 的最後一个块拼图

那我们已经在昨天说明了 Pytorch 的 Dataset 跟 DataLoader 要如何建立了...