2016-12-15 16 views
1

Я сейчас читаю кусочки Обратимся к шаблонам параллелизма. Я немного запутался о кажущемся противоречии между утверждением о slide #16:Является ли просто нормальным горутин?

Когда основные возвратов, программа завершается и принимаю скучную функцию вместе с ней.

и еще один на slide #19 (в сочетании с example on slide #20):

Канал в Go обеспечивает связь между двумя goroutines, что позволяет им взаимодействовать.

Если mainявляется только goroutine, как это может привести к какой-либо другой (породил) goroutine остановиться, другими словами: в каком смысле goroutine назван main особенным? *


* Я искал его, но ничего не нашли, очевидно, поучительный до сих пор; вопрос SO с перспективным названием Difference between the main goroutine and spawned goroutines of a Go program задает совершенно другую проблему.

редактировать: изменил название, чтобы сосредоточиться на разнице между основным и «нормальным» goroutines (после того, как наткнулась функции выполнения Go Goexit)

редактирования: упрощенный вопрос, еще более сфокусированный по особенностям основного

+3

Что вы подразумеваете под «как он может взять под свой контроль другую горутин»? Похоже, что не упоминается о том, что горутин контролирует что-то еще. Обратите внимание, что когда программа возвращается из main(), весь процесс умирает/завершается. main() - почти «просто» гуротин. Но это особенное, потому что, естественно, здесь начинается выполнение всей программы (помимо любых выполняемых функций init()), и когда main() заканчивается, процесс умирает. – nos

+0

@nos Я попытался прояснить это в вопросе, если это просто плохой английский, пожалуйста, помогите мне не родным. – Wolf

+0

@nos * '... почти« просто »гуротин. Но это особенное, потому что ... '* именно то, что я прошу (можете ли вы объяснить это более подробно?). Первый пример в слайдах показывает канальную связь между основным и другим гортаном. Мне было интересно узнать больше, потому что я сравниваю это с потоками в Windows (там идея каждого потока эквивалентна в том смысле, что я могу поддерживать процесс, но каждый из них может выйти из процесса). (Я уже знаю: goroutines - это не потоки, но для сравнения я надеюсь лучше понять концепцию) – Wolf

ответ

3

Я думаю, что вам нужно учитывать последствия goroutine отдельно от последствий процесса.

Функция main() является goroutine (или если вы хотите быть действительно придирчивым, вызванным из неявно созданного goroutine). Использование go создает другие goroutines. Возврат с main() завершает работу с goroutine, но также завершает процесс в целом (и, следовательно, все остальные goroutines). Также можно завершить процесс в целом, позвонив по номеру os.Exit() или аналогично с любого горутина.

+1

* 'Также можно завершить процесс в целом, вызвав os.Exit() или аналогичный из любого goroutine. '* - спасибо за упоминание этой детали, это был бы мой следующий вопрос (не паникуйте, а не на SO;)) – Wolf

+0

Стоит отметить, что также вполне возможно прекратить функцию' main() 'goroutine без прекращения (предполагая, что другие горуты активны), используя ['runtime.Goexit()'] (https://golang.org/pkg/runtime/#Goexit). – Kaedys

+0

@Kaedys * 'runtime.Goexit()' * <- это, как мне показалось, не рекомендуется, так как после завершения последней порожденной сопрограммы нет чистого выхода процесса. («Если все остальные горуты выходят из программы, программа вылетает». См. Ссылку, которую вы указали) – Wolf