Облачный Go. Создание надежных служб в ненадежных окружениях [Мэтью А. Титмус] (pdf) читать постранично, страница - 34

-  Облачный Go. Создание надежных служб в ненадежных окружениях  (пер. А. Н. Киселев) 11.31 Мб, 419с. скачать: (pdf) - (pdf+fbd)  читать: (полностью) - (постранично) - Мэтью А. Титмус

Книга в формате pdf! Изображения и текст могут не отображаться!


 [Настройки текста]  [Cбросить фильтры]

приводит к безумно трудным для отладки
ошибкам, таким как состояние гонки или взаимоблокировки.
В Go была избрана иная стратегия: в нем предлагаются два примитива
поддержки конкуренции – сопрограммы (gorutines) и каналы, – которые
можно использовать для структурирования программного обеспечения, выполняющегося конкурентно, и ослабления зависимости от блокировок. Она
побуждает разработчиков ограничивать совместное использование памяти
и организовывать взаимодействия между процессами путем передачи сообщений.

Сопрограммы
Одна из самых мощных особенностей Go – ключевое слово go. Любой вызов функции, к которому добавлено ключевое слово go, будет выполнен как
обычно, но при этом вызывающий сможет продолжить работу, не ожидая,

Самое интересное: конкуренция  83

пока функция завершит работу. За кулисами такая функция выполняется
как легковесный параллельный процесс, который называют сопрограммой.
Синтаксис поразительно прост: функция foo, выполняющаяся последовательно, если ее вызвать как foo(), может выполняться конкурентно, как
сопрограмма, достаточно лишь добавить в инструкцию вызова ключевое
слово go:
foo()
// Вызвать foo() и ждать ее завершения
go foo() // Запустить новую сопрограмму, которая вызовет foo() конкурентно

В сопрограммах можно запускать литералы функций:
func Log(w io.Writer, message string) {
go func() {
fmt.Fprintln(w, message)
}() // Не забудьте добавить круглые скобки в конце!
}

Каналы
Каналы в языке Go – это типизированные примитивы, поддерживающие
возможность взаимодействий двух сопрограмм. Они действуют как трубопроводы, через которые сопрограммы могут пересылать значения друг другу.
Каналы можно создавать с по­мощью функции make. Каждый канал может
передавать значения только одного определенного типа, который называют
типом элементов. Типы каналов записываются с использованием ключевого
слова chan, за которым следует тип элемента. Вот пример объявления и создания канала типа int:
var ch chan int = make(chan int)

Каналы поддерживают две основные операции: отправка и прием. Обе
записываются с использованием оператора