2015-08-22 421 views
0

我使用去例程下面的代碼來了解圍棋程序的這種怪異的bahaviour:需要幫助

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) 
} 

我期待各走各的例程將等待一秒鐘,然後打印出它的值i。

但是,兩個go例程每次等待1秒,並立即打印出i的所有值。

在同樣的上下文中的另一個問題是: 我有一個服務器端客戶端應用程序,其中服務器產生一個接收器去例行程序接收來自每個客戶端連接的客戶端數據。然後,接收器去例行程序產生一個工作者去例行程序來處理數據。可能有多個接收器去例程,因此多個處理器去例程。 在這種情況下,一些接收器和處理器去例行程序可能無限期地消耗。

請幫我理解這種行爲。

+2

你必須明白的是,聲明'去thread_1()'立即返回,讓所有夠程在一個非常短的時間內創建的,所以所有的睡眠呼叫將幾乎同時返回。 – SirDarius

回答

3

你在一個大批量中跨100個運行thread_1和100個goroutines的例程運行thread_2。這200套房間中的每一間都睡一秒鐘,然後打印並結束。所以是的,這種行爲是可以預料的:平行睡眠1秒,然後並行打印200道程序。

(我不明白你的第二個問題)