需要帮助来理解这个奇怪的例行公事

时间:2015-08-22 18:24:31

标签: go goroutine

我使用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例程都等了1秒,并且一次打印了i的所有值。

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

请帮助我理解这种行为。

1 个答案:

答案 0 :(得分:3)

你跨越100个goroutines运行thread_1和100个goroutines运行thread_2在一个大批量。这200个goroutine中的每一个都会睡一秒钟然后打印并结束。所以是的,行为是可以预期的:200个goroutines平行每1秒睡觉,然后200个goroutines并行打印。

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