приводит к безумно трудным для отладки
ошибкам, таким как состояние гонки или взаимоблокировки.
В 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)
Каналы поддерживают две основные операции: отправка и прием. Обе
записываются с использованием оператора
Последние комментарии
5 часов 44 минут назад
13 часов 44 минут назад
1 день 4 часов назад
1 день 8 часов назад
1 день 8 часов назад
1 день 8 часов назад