【发布时间】: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调用几乎会同时返回。