Skip to content

Golang chapter 0190#382

Open
korepanov wants to merge 18 commits intosenjun-team:mainfrom
korepanov:golang-chapter-0190
Open

Golang chapter 0190#382
korepanov wants to merge 18 commits intosenjun-team:mainfrom
korepanov:golang-chapter-0190

Conversation

@korepanov
Copy link
Contributor

No description provided.

fmt.Printf("validNumber=%d, invalidNumber=%d, unknownNumber=%d\n",
validNumber, invalidNumber, elementsNumber-validNumber-invalidNumber)
}
func main() {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Здесь и далее. Форматирование кода. Нет пробела между функциями.


Метод `Add` должен быть вызван перед запуском горутин, а не внутри них! В противном случае мы не можем быть уверены, что вызвали его до метода `Wait`.

Следующий пример демонстрирует использование `sync.WaitGroup`. Программа должна обработать матрицу оборудования размером *1 млн.* элементов. Каждый элемент представляет собой структуру из имени оборудования и признака того, что оно валидно. Допустимым именем оборудования является любая строка, в которой отсутствуют символы `"!@#$%^&*()"`. В противном случае имя является недопустимым. Необходимо проставить признак допустимости имени для каждого элемента.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

в которой отсутствуют символы "!@#$%^&*()"

Когда хочешь получить валидную строку, то описываешь разрешенные символы, а не запрещенные. Например, разрешены alphanum и пробелы. А в твоем случае получается, что также разрешены непечатаемые символы, управляющие символы, бэктики, знак равно и тд и тп.

@@ -0,0 +1,870 @@
# Глава 19. Управление параллельным исполнением

В этой главе мы познакомимся со счетчиком `sync.WaitGroup`. Он позволяет дождаться окончания работы нескольких горутин. До сих пор мы использовали для этого каналы. Счетчик `sync.WaitGroup` предоставляет более удобные и надежные средства для этих целей.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

и надежные средства

из формулировки складывается впечатление, что каналы работают нестабильно) Ты же имел ввиду надежные в плане недопускания ошибок в коде? Лучше переформулируй


Также отметим один важный момент. Функция `runtime.NumCPU` подсчитывает не только количество физических ядер, но и количество логических. Для некоторых задач нужно знать именно число физических ядер, потому что распараллеливать задачи по логическим не имеет смысла. Иногда это может даже замедлить работу. Например, для тяжелых математических расчетов, имеющих большое количество операций с плавающей точкой.

Такие задачи плохо запускать параллельно на ядрах, которые имеют только один блок для операций с плавающей точкой (FPU). Потоки запущенные, на одном ядре, будут конкурировать за FPU.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Потоки запущенные, на одном ядре, будут конкурировать за FPU.

Потоки, запущенные на одном ядре, будут конкурировать за FPU.

И предлагаю добавить ссылку:

https://ru.wikipedia.org/wiki/%D0%9C%D0%B0%D1%82%D0%B5%D0%BC%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D1%81%D0%BE%D0%BF%D1%80%D0%BE%D1%86%D0%B5%D1%81%D1%81%D0%BE%D1%80

cpuNumber = 6
```

Понятное дело, что вывод индивидуален, в зависимости от машины.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Я бы даже убрала эту фразу)

}
```

## Мьютекс чтения/записи `sync.RWMutex`
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

бэктики в заголовках не надо. Мы это плохо обрабатываем.


## Мьютекс чтения/записи `sync.RWMutex`

Мы говорили о мьютексах ранее. Как уже было сказано, мьютексы защищают данные, предотвращая состояние гонки. Примитив синхронизации `sync.Mutex` блокирует доступ к данным для всех других горутин, пока текущая горутина не завершит свою работу с этими данными. Однако это не всегда оптимально. Что, если `10` горутин одновременно читают данные? Если использовать `sync.Mutex`, то чтение окажется последовательным. В действительности эти `10` горутин не мешают друг другу. Может быть, тогда вообще обойтись без мьютекса? Это правильное решение в случае, когда никто эти данные не пишет. В случае, когда есть писатель, хотелось бы одновременно читать, но блокировать горутину на запись. Примитив `sync.RWMutex` решает эту задачу.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Мы говорили о мьютексах ранее.

Добавь плиз на тот абзац якорь и здесь сделай ссылку.

* `RUnlock`. Снимает блокировку `Rlock`.


Примитив синхронизации `sync.RWMutex` оптимальнее, так как множественные чтения могут выполняться параллельно. Чтобы убедиться в этом, рассмотрим пример. В нем мы работаем с двумя кешами: `CacheRWMutex` и `CacheMutex`. Первый использует мьютекс `RWMutex`, второй — `Mutex`. Чем больше читателей и меньше писателей, тем больше выигрыш по производительности.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

оптимальнее

лучше так не говорить, многие докапываются)


## Захват глобальных переменных горутиной

Существует одна известная проблема захвата глобальных переменных горутиной. Рассмотрим пример. На момент написания курса проблема все еще существовала. Для проверки этого кода использовался компилятор Go 1.26. Возможно, что на более новых версиях поведение будет изменено.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"одна" - лишнее слово

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants