2015-04-21 3 views
0

Все, что я хочу сделать, это отправить одно значение на канал и вернуться из функции main() и выйти из программы сразу после получения одного значения из канала ch.Goroutine and for loop

Но это продолжает работать вечно:

ch := make(chan int) 

for { 
    go func() { 
     ch <- 1 
    }() 
} 

<-ch 

Как вернуться с этим for цикла после того, как получить одно значение из канала?

И почему это работает вечно?

Go площадка ссылка здесь

http://play.golang.org/p/EvmT6Pw96Y

+2

Почему вы используете for-loop? –

+0

просто экспериментальный. Я просто хотел запустить goroutines и выйти из основной программы –

ответ

3

Поскольку цикл for работает навсегда, ваш код работает навсегда. Получение от ch после цикла for никогда не достигается.

Если вы хотите, чтобы ваш код вышел из него, вы должны закончить цикл for, например. заставить ее работать только определенное число итераций:

for i := 0; i < 5; i++ { 
    ... 
} 

Так что если вы только пробежать 5 итераций (как в моем примере), после того, как for цикл приема от ch будет выполняться, который может блокировать (поскольку ch небуферизован) если другие goroutines еще не запущены, и будет выполнен хотя бы один из запущенных goroutines, который отправит значение на канале, которое может привести к продолжению главного goroutine (поскольку его блокировка работает больше не блокирует).

Также обратите внимание, что Go Memory Model гарантирует, что определенные события произойдут до других событий, у вас нет гарантии, как выполняются 2 одновременных goroutines. У вас нет гарантии, что goroutines, запущенные в цикле for, начнут выполняться до того, как главный goroutine будет заблокирован при получении от ch.

Обычно, когда goroutine блокируется (например, операция приема блокирующего канала), среда выполнения может планировать запуск другого goroutine.

+0

Спасибо, я думал, что один из первых goroutine внутри for-loop запускается на заднем плане, и если я получу один из них, основной выход. –

+0

Чтение с канала никогда не достигается, потому что основная процедура вращается в бесконечном цикле, запуская бесконечное количество коррутанов. Эта программа должна потерпеть крах из-за нехватки памяти или заморозить компьютер через несколько секунд, поскольку он все время выделяет память. – Archy