当前位置: 首页 > 面试题库 >

为什么这个Google I / O 2012并发示例无法正常工作?

谭志用
2023-03-14
问题内容

我正在尝试跟Rob Pike的Google I / O 2012演讲“ Go Concurrency”一起进行。我正在尝试通道多路复用的示例,以使“
Ann”和“ Joe”不会步调一致。但是使用下面的代码,它们仍然处于锁定状态。我要去哪里错了?

视频:http
:
//www.youtube.com/watch?v=
f6kdp27TYZs&
feature=player_detailpage#
t=
1025s

package main

import (
    "fmt"
    "time"
    "math/rand"
    )

func fanIn(input1, input2 <-chan string) <-chan string {
    c := make(chan string)
    go func() { for {c <- <-input1 } }()
    go func() { for {c <- <-input2 } }()
    return c
}

func main() {
    c := fanIn(boring("Joe"), boring("Ann"))
    for i:=0; i<10; i++ {
        fmt.Println(<-c)
    }
    fmt.Printf("You're both boring, I'm leaving...\n")
}

func boring(msg string) <-chan string {
    c := make(chan string)
    go func() { // launch goroutine from inside the fn
        for i:=0; ; i++ {
            c <- fmt.Sprintf("%s %d", msg, i)
            time.Sleep(time.Duration(rand.Intn(1e3)) * time.Millisecond )
        }
    }()
    return c
}

以及它的输出(在Ubuntu 10.04 LTS上为go1.0.2版)

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...

我哪里做错了?谢谢!


问题答案:

您的代码很好;要使它们不同步,往往需要花费更多。循环更多次,您应该看到它们脱离了锁步:

for i := 0; i < 20; i++ { // Going up to 20 is enough to usually see it
    fmt.Println(<-c)
}

我得到以下输出:

乔0
安0
乔1
安1
乔2
安2
乔3
安3
乔4
安4
乔5
安5
乔6
安6
安7
乔7
乔8
乔9
安8
安9


 类似资料:
  • 问题内容: 我无法弄清楚为什么我的简单AngularJS应用无法正常工作。“正在加载…”应该被隐藏,然后“完成!” 1秒后应显示。 的HTML: Javascript: 问题答案: 您需要告诉angular您更新了var: 要不就

  • 问题内容: 看来AngularJS的不起作用。它不适用于数字字符串。难道我做错了什么?我应该使用吗? 我需要一些东西来查看字符串是否是一个数字(实际上是一个数字),除非我乘以1,否则我不会这么做,但是如果我这样做,那么它将始终为真。另外是不是一个数字(定义)等应该返回false。 问题答案: 在 JavaScript中 ,。 例如,如果需要将 字符串 识别为 Number ,则将其转换为 Numb

  • 问题内容: 我试图通过使用该方法销毁所有会话变量,但是在使用此方法之后,这些值不会被销毁。 为什么不工作? 还有其他方法可以销毁PHP中的会话吗? 问题答案: 使用后,会话将在后台被销毁。由于某种原因,这不会影响已为此请求填充的中的值,但在以后的请求中将为空。 如果需要,您可以手动清除()。

  • 问题内容: 这是我的代码: 这是我的输出: 我的理解 是。因此,应该首先一个号码,然后松开,然后给到线或。所以,一次应该有一个数字,对吧? 但是为什么我的代码一次是两个或三个数字?我做错什么了吗(我是新手)? 问题答案: 虽然确实不是同步的,但是它访问变量。 即使您同步访问权限,它也无济于事,因为下一种情况仍然可能: 线程1增量 线程2增量 线程1的打印值 线程2的打印值 要解决此问题,您需要增加

  • 问题内容: 为什么这不起作用? 实际上,我所有的元素都不可见。如果我在选择器中删除对的引用,则确实会显示div中的最后一个,但这不是我想要的。 当然,我只能一直保留一个,但这只是一个reveal.js演示文稿,我无法控制JavaScript。 如何选择带有类的div中的最后一个元素?我不想为此使用JavaScript。 问题答案: 您的问题是,您正在阅读并认为它可以用作选择器,而实际上它 仅 表示

  • 问题内容: 我在Ubuntu Hardy VPS上做了一份计划工作,只有一半可以工作,我不知道为什么。这项工作是一个Ruby脚本,它使用mysqldump备份Rails应用程序使用的MySQL数据库,然后将其压缩并使用SFTP上传到远程服务器。 gzip文件已成功创建并复制,但始终为零字节。但是,如果我直接从命令行运行cron命令,它将运行完美。 这是cron工作: 这是datadump.rb: