【问题标题】:Need help to understand this weird bahaviour of go routines需要帮助来理解 goroutine 的这种奇怪行为
【发布时间】:2015-08-23 02:41:59
【问题描述】:

我使用 go 例程跟踪代码:

package main

import  ( 
    "fmt"
    "time"
)

func thread_1(i int)    {
    time.Sleep(time.Second * 1)
    fmt.Println("thread_1: i: ",i)
}   

func thread_2(i int)    {
    time.Sleep(time.Second * 1)
    fmt.Println("thread_2: i: ",i)
}

func main() {
    for i := 0; i < 100; i++    {
        go thread_1(i)
        go thread_2(i)
    }

    var input string
    fmt.Scanln(&input)
} 

我希望每个 go 例程都会等待一秒钟,然后打印它的 i 值。

但是,两个 go 例程都等待 1 秒,并一次打印 i 的所有值。

同一上下文中的另一个问题是: 我有一个服务器-客户端应用程序,其中服务器生成一个接收器 go 例程,以便为每个客户端连接从客户端接收数据。然后接收者 go 例程产生一个称为处理器的工作 go 例程来处理数据。可能有多个接收器 go 例程,因此有多个处理器 go 例程。 在这种情况下,某些接收器和处理器 go 例程可能会无限期地占用。

请帮助我理解这种行为。

【问题讨论】:

  • 你必须明白go thread_1()这个语句会立即返回,所以你所有的goroutines都是在很短的时间内创建的,所以所有200个Sleep调用几乎会同时返回。

标签: go goroutine


【解决方案1】:

你跨越 100 个运行 thread_1 的 goroutines 和 100 个运行 thread_2 的 goroutines 在一个大批量中。这 200 个 goroutine 中的每一个都休眠一秒钟,然后打印并结束。所以是的,这种行为是意料之中的:200 个 goroutines 每 1 秒并行休眠,然后 200 个 goroutines 并行打印。

(我不明白你的第二个问题)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-15
    • 2017-04-06
    • 1970-01-01
    • 1970-01-01
    • 2014-12-20
    相关资源
    最近更新 更多