2015-08-22 3 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.

Однако обе процедуры обработки ожидали по 1 секунде и печатали все значения i одновременно.

Другой вопрос в том же контексте: У меня есть сервер-клиентское приложение, в котором сервер запускает процедуру приема, чтобы получать данные от клиента по одному для каждого клиентского соединения. Затем приемник запускает процедуру, которая запускает подпрограмму рабочего процесса, называемую процессором, для обработки данных. Могут существовать несколько процедур для приема на приемник и, следовательно, несколько программных подпрограмм. В таком случае некоторые приемники и процессорные подпрограммы могут свирепствовать бесконечно.

Пожалуйста, помогите мне понять это поведение.

+2

Вы должны понять, что заявление 'идти thread_1()' возвращает сразу, поэтому все ваши goroutines созданы в очень короткий промежуток времени, так что все 200 Сон вызовет почти одновременно. – SirDarius

ответ

3

Вы занимаете 100 горитов, выполняющих thread_1 и 100 goroutines, выполняющих thread_2 в одной большой партии. Каждый из этих 200 goroutines спит в течение одной секунды, а затем печатает и заканчивает. Так что да, поведение должно быть ожидаемым: 200 горьков спят каждые 1 секунду параллельно, а затем 200 роутеров печатаются параллельно.

(И я не понимаю, ваш второй вопрос)

Смежные вопросы