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