go - 需要帮助来理解 goroutines 的这种奇怪行为

标签 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 例程都会等待一秒钟,然后打印它的 i 值。

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

同一上下文中的另一个问题是: 我有一个服务器-客户端应用程序,其中服务器生成一个接收器去例程以从每个客户端连接的客户端接收数据。然后 receiver go routine 产生一个叫做 processor 的 worker go routine 来处理数据。可能有多个接收器 go routines,因此有多个 processor go routines。 在这种情况下,某些接收器和处理器执行例程可能会无限期占用。

请帮助我理解这种行为。

最佳答案

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

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

关于go - 需要帮助来理解 goroutines 的这种奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32159402/

相关文章:

go - 为什么错误不匹配 nil ?去

go - 将参数作为接口(interface)传递

go get -u 对带有 go1 分支的包失败

go - panic :同步:否定的WaitGroup计数器,其中有多个请求到达同一端点

go - 我如何等待对多个其他 Goroutines 的单个 Goroutine 响应?

go - 如何使用 bigtable Go 客户端支持分页?

json 解码/解码在 json 中没有按预期工作

multithreading - 半异步代码逻辑

go - goroutines到底是什么?

go - 改变合并排序中 channel 的使用会杀死我的程序;或者我在处理 goroutine 时误解了范围?