Go-подпрограммы и каналы

Параллельное программирование, выражение программы как композиции ряда автономных действий, никогда не было столь важным, как сегодня. Веб-серверы одновременно обрабатывают запросы тысяч клиентов. Приложения на планшетах и в телефонах визуализируют анимацию интерфейса пользователя и одновременно в фоновом режиме выполняют вычисления и сетевые запросы. Даже традиционные пакетные задачи — чтение некоторых входных данных, выполнение вычислений и запись некоторых выходных данных — используют параллелизм для того, чтобы скрыть задержки операций ввода-вывода и использовать множество процессоров современного компьютера, количество которых с каждым годом растет все больше, в отличие от их скорости.

Go обеспечивает два стиля параллельного программирования: 1) модель многопоточности с общей памятью и 2) go-подпрограммы (goroutines) вместе с каналами. go-подпрограммы (goroutines) и каналы поддерживают взаимодействующие последовательные процессы (communicating sequential processes — CSP), модель параллелизма, в которой между независимыми процессами (go-подпрограммами, горутинами) передаются значения, но переменные по большей части ограничиваются одним процессом.

Несмотря на то что поддержка параллелизма в Go является одной из его самых сильных сторон, рассмотрение параллельных программ существенно труднее, чем последовательных, а приобретенная при последовательном программировании интуиция может время от времени вводить в заблуждение. Если это ваша первая встреча с параллелизмом - потратьте необходимое количество дополнительного времени на серьезные размышления над приводимыми здесь примерами.