454.13K
Category: programmingprogramming

Многопоточность в Go

1.

Многопоточность в Go

2.

Многопоточность в Go
● Что такое многопоточность?
● Для чего она нужна?
● Какие существуют средства многопоточности в Go?

3.

Многопоточность в Go

4.

Для чего нужна многопоточность?
● CPU bound вычисления
● IO bound вычисления
● Выполнение задачи “на фоне”

5.

Goroutines
Горутина - функция, которая выполняется асинхронно.
Горутина вызывается с помощью ключевого слова go

6.

Channels
Канал - основной примитив синхронизации в Go. Также основной способ
обмена информацией между горутинами.
Каналы реализуют принцип “Don't communicate by sharing memory; share memory by
communicating.”
Каналы создаются при помощи функции make.
c:=make(chan int) // Создание канала.
c <- 1
// Запись в канал.
number := <- c
// Чтение из канала.

7.

Channels
Каналы бывают буферизованными. Буферизованный канал может хранить в
себе n значений, а также является неблокирующим.
c:=make(chan int)
c <- 1
doStuff()
// Небуферизованный канал.
// Блокируется.
// Ждем пока какая-либо рутина прочитает из канала.
c:=make(chan int, 1) // Буферизованный канал с вместимостью 1 элемент.
c <- 1
// Не блокируется.
doStuff()
// Выполняем сразу.

8.

Channels
Каналы можно закрыть. Когда канал закрыт, попытка записать в него новое
значение приведет к панике! Попытка прочитать из закрытого канала не
приводит к панике. Если в закрытом канале осталось одно или больше
значений, то мы будем их получать по порядку, пока они не закончатся. Если
значений не осталось, то мы получим нулевое значение типа канала. Можно
проверить, остались ли значения в канале с помощью ok-паттерна
Каналы также можно итерировать в цикле с помощью range. Если канал не
закрыт, то при прочтении всех значений из канала мы заблокируем рутину и
будем ждать новых значений. Если канал закрыт и мы прочитали последнее
значение с помощью range, то цикл прервется.

9.

Channels

10.

Улучшенная программа из первого примера

11.

Select
Select позволяет ожидать готовности
сразу на нескольких каналах. Если
оба канала заблокированы, то
заблокирован весь select. Как только
любой из каналов разблокируется, то
выполняется case этого канала. Если
одновременно разблокированы
несколько каналов, то первый case
для выполнения будет выбран
случайно.

12.

Mutex
Mutex - дополнительный примитив
синхронизации. Защищает ресурс от
доступа одновременно из нескольких
горутин.

13.

Goroutines scheduler

14.

Go scheduler
● Планировщик вытесняющий (не кооперативный!) Был кооперативным до
версии 1.14

15.

CPU bound vs IO bound
● Использование многопоточности в CPU bound вычислениях позволяет
ускорить программу только в том случае, если вычисления удается
перенести на другое ядро. Если все ядра процессора уже заняты, то
ускорения программы достигнуть не получится. Примеры CPU bound
вычислений:



Арифметические (логические) операции
Сортировка
Поиск
● Использование многопоточности в IO bound операциях зачастую дает
значительный прирост в скорости выполнения программы. Примеры IO
bound операций:


Чтение файла с диска
Сетевой запрос

16.

Домашнее задание
1. Написать любую CPU load функцию
2. Запустить эту функцию n раз синхронно и асинхронно, проверить время
выполнения программы в обоих случаях
3. Придумать свой способ балансировки нагрузки (любой, fan in fan out,
например)
English     Русский Rules