我使用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接收数据。然后接收器去例程产生一个称为处理器的工作进程例程来处理数据。可能有多个接收器转到例程,因此有多个处理器转到例程。 在这种情况下,一些接收器和处理器的程序可能会无限期地占用。
请帮助我理解这种行为。
答案 0 :(得分:3)
你跨越100个goroutines运行thread_1和100个goroutines运行thread_2在一个大批量。这200个goroutine中的每一个都会睡一秒钟然后打印并结束。所以是的,行为是可以预期的:200个goroutines平行每1秒睡觉,然后200个goroutines并行打印。
(我不明白你的第二个问题)