Современные процессоры (CPU) имеют несколько ядер, и некоторые поддерживают гиперпоточность, поэтому они могут обрабатывать несколько инструкций одновременно. Чтобы полностью утилизировать современные CPU, нужно использовать конкурентное программирование.
Конкурентные вычисления — это форма вычислений, когда несколько инструкций выполняются, пересекаясь, в течение одного временного периода.
Например есть 2 инструкции, которые нужно выполнить: А и B. При выполнении инструкций конкурентно ядро процессора вычисляет инструкцию A, при ожидающей B. Когда первая инструкция A заканчивает активное вычисление, она ставится на паузу, и ядро переключается на вычисление инструкции B.
Рассмотрим простой пример конкурентности в реальной жизни: HTTP запрос к стороннему сервису по сети:
Если в процессоре присутствует более одного ядра, обработка происходит параллельно. Возвращаясь к примеру выше, инструкции A и B будут выполняться независимо в один момент времени.
Конкурентные вычисления могут происходить в программе, компьютере или сети. В данном курсе рассматривается только уровень программ.
Как это все относится к Go? Разберемся в следующем уроке.
Написать конкурентный код самостоятельно в данном уроке не получится, поэтому давайте подготовимся к следующему уроку реализацией синхронного кода.
Реализуйте функцию MaxSum(nums1, nums2 []int) []int
, которая суммирует числа в каждом слайсе и возвращает слайс с наибольшей суммой. Если сумма одинаковая, то возвращается первый слайс.
Пример работы:
MaxSum([]int{1, 2, 3}, []int{10, 20, 50}) // [10 20 50]
MaxSum([]int{3, 2, 1}, []int{1, 2, 3}) // [3 2 1]
Если вы зашли в тупик, то самое время задать вопрос в «Обсуждениях». Как правильно задать вопрос:
Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.
Это нормально 🙆, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи.
В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.
Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в «Обсуждениях». Идеально, если вы сформулируете непонятные моменты в виде вопросов. Обычно нам нужно несколько дней для внесения правок.
Кстати, вы тоже можете участвовать в улучшении курсов: внизу есть ссылка на исходный код уроков, который можно править прямо из браузера.
Ваше упражнение проверяется по этим тестам
1package solution
2
3import (
4 "github.com/stretchr/testify/assert"
5 "testing"
6)
7
8func TestMaxSum(t *testing.T) {
9 a := assert.New(t)
10 a.Nil(MaxSum(nil, nil))
11 a.Equal([]int{3, 4, 5, 6}, MaxSum([]int{1, 2, 3}, []int{3, 4, 5, 6}))
12 a.Equal([]int{1, 2, 3}, MaxSum([]int{1, 2, 3}, []int{3, 2, 1}))
13 a.Equal([]int{10, 20}, MaxSum([]int{10, 20}, []int{4, 6}))
14}
15
Решение учителя откроется через: