- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我正在学习 Go 中的并发模式,不确定点 A 的目的是什么?
代码取自:https://talks.golang.org/2012/concurrency.slide#30
谁能给我解释一下?谢谢
type Message struct {
str string
wait chan bool
}
func main() {
c := fanIn(boring("Joe"), boring("Ann"))
for i := 0; i < 5; i++ {
msg1 := <-c
fmt.Println(msg1.str)
msg2 := <-c
fmt.Println(msg2.str)
msg1.wait <- true
msg2.wait <- true
}
fmt.Println("You're both boring; I'm leaving.")
}
func fanIn(input1, input2 <-chan Message) <-chan Message {
c := make(chan Message)
go func() {
for {
c <- <-input1
}
}()
go func() {
for {
c <- <-input2
}
}()
return c
}
func boring(msg string) <-chan Message {
waitForIt := make(chan bool)
c := make(chan Message)
go func() { // We launch the goroutine from inside the function.
for i := 0; ; i++ {
c <- Message{fmt.Sprintf("%s %d", msg, i), waitForIt}
time.Sleep(time.Duration(rand.Intn(2e3)) * time.Millisecond)
<-waitForIt // <-----------------Point A
}
}()
return c // Return the channel to the caller.
}
最佳答案
fanIn
产生两个 goroutines 从第一个和第二个“无聊的”消息 channel 读取数据。由于两个 goroutine 中的任何一个都可能正在运行(另一个 goroutine 也在休眠或运行),我们不知道元素写入统一 channel 的顺序:
A A A A A \
> A B B A A A B A B B
B B B B B /
请注意,生成的序列没有特定顺序。
这可以通过 commenting out the "waiting"-channels 来证明:
Joe 0
Ann 0
Joe 1
Ann 1
Joe 2
Ann 2
Joe 3
Joe 4
Joe 5
Ann 3
You're both boring; I'm leaving.
等待 channel 的存在是为了恢复您链接的幻灯片所说的顺序。我们想要这个:
A A A A A \
> A B A B A B A B A B
B B B B B /
请注意 Ann 和 Joe 如何 talk one after the other now :
Joe 0
Ann 0
Joe 1
Ann 1
Joe 2
Ann 2
Joe 3
Ann 3
Joe 4
Ann 4
You're both boring; I'm leaving.
这段代码的作者决定通过让它们在 waitForIt
上等待并在 main
中通知来同步对 channel 的写入。此行为依赖于我们在 main
的 for
循环中获得的前两条消息是否有序。如果不是,我们将得到相反的序列。
也许我没有看到任何更多的绝对同步保证,也许作者不关心序列的顺序,只要它是一个重复序列,但这段代码并没有让我觉得是一个特别好的例子并发和同步。
关于转到 channel : the function of one extra line,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26115537/
我正在将 ansible 合并到我们的内部 RHN 卫星中。我有来自 Red Hat 的完全更新的 RHEL 7 基础 repo 、附加、补充、可选和 RHN 工具。当我们需要它们时,我还会将选定的包
我尝试将一些值发送到另一个 Activity 。 recyclerView.addOnItemTouchListener(new RecyclerTouchListener(getApplicatio
我有这个代码: Intent intent = new Intent(); intent.setAction(Intent.ACTION_PICK); intent.s
几天前,我一直在努力寻找一种方法来为我的闹钟使用自定义 Intent 。虽然我得到了明确的答案,但我必须根据一些唯一的 ID 来定制 Intent,例如。 setAction()还是有一些问题。 我这
通知正在提供旧值。我阅读了 stackoverflow 链接,但仍然不适合我: Notification passes old Intent Extras 我有一个 Activity A。当我在 Ac
我想写以下内容: result = [] for x in list(range(10)): if x%2 != 0: for a in [1,2]:
我在使用 mysql 5.5.12 时遇到了 Amazon RDS 的 IO 性能问题。有 2 种实例类型相似且价格接近: 超大数据库实例:15 GB 内存、8 个 ECU(4 个虚拟核心,每个 2
这里是 Android 的新手,我正在与一位资深人士就 bundle 和 Intent 进行辩论。这就是我一直在做的...... Intent intent = new Intent(this, Ta
我使用的是MinGW+MSYS, 我添加了 extra-include-dirs、extra-lib-dirs,但似乎没有任何东西可以帮助 cabal 找到 PCRE 库。以下是我尝试过的一些命令行,
我已将 CVS 中的一个模块 check out 到新安装的 Windows 7 计算机上。病毒扫描程序尚未安装。 后来,当我尝试进行更新时,收到以下错误消息: 无法将文件 CVS/Entries.E
Alpine镜像中的telnet在3.7版本后被转移至busybox-extras包中,需要使用apk单独安装。 现象 Alpine版本为3.8, 不再有指向busybox的telent
对lazy="extra"究竟能做什么,有没有很好的解释? 我看过的所有帖子都只是重复了一个事实,即它会引用 MyObject.ItsCollection.Count进入 select count(*
这个问题已经有答案了: Two semicolons inside a for-loop parentheses (4 个回答) Endless loop in C/C++ [closed] (12
我的包为包含的额外内容返回空字符串。不是 NPE,是实际的“空”值。关于为什么会发生这种情况的任何想法? 新 bundle String u = nul
在 es6 中,以下似乎是有效代码: function test(a1,{a=1,b=2} = {},) {} 注意函数参数中额外的,。我不确定这是否是一个错误,因为这个额外的 , 仅适用于解构分配。
我正在查看一个包含 .myClass a.extra{...} 和 .myClass a.extra:hover{...} 的 css 模板“额外”是什么意思? 最佳答案 extra 是类名。 因为你
我来自 Web 开发的前端世界,我们非常努力地尝试限制发出的 HTTP 请求的数量(通过合并 css、js 文件、图像等)。 对于数据库连接 (MySQL),显然您不希望有不必要的连接,但作为一般规则
问题是关于包含不必要的 header 以避免在子文件中多次调用它。这是场景,我有几个文件: srlogger.h srinterface.h srinterface.cc #include #inc
我有一个程序表现出奇怪的行为 #include #include using namespace std; class man{ int i ; public:
本文整理了Java中org.threeten.extra.YearQuarter类的一些代码示例,展示了YearQuarter类的具体用法。这些代码示例主要来源于Github/Stackoverflo
我是一名优秀的程序员,十分优秀!