|
|
@@ -11,7 +11,7 @@
|
|
|
- [Неявные правила работа с данными](#неявные-правила-работа-с-данными)
|
|
|
- [Как определить есть ли что-то в канале](#как-определить-есть-ли-что-то-в-канале)
|
|
|
- [Что не так с длиной канала](#что-не-так-с-длиной-канала)
|
|
|
- - [Примеры](#примеры)
|
|
|
+ - [Пример](#пример)
|
|
|
|
|
|
Каналы в `go` являются попыткой решить проблему безопасности данных в конкуретной среде.
|
|
|
Это неидеальная попытка реализовать [монитор Хоара](https://ru.wikipedia.org/wiki/Монитор_(синхронизация)). Неидеальность связана с тем, что подавляющая часть решений в `go` продиктована несколькими соображениями:
|
|
|
@@ -90,15 +90,15 @@ flowchart LR
|
|
|
- кто канал создал -- тот его и закрывает;
|
|
|
- кто канал создал -- тот и отдаёт канал, но _только для чтения_;
|
|
|
- кто канал читает -- ничего с ним не делает;
|
|
|
-- при длительный операциях надо специальным вызовом дават ьвозможность рантайму немного поработать.
|
|
|
+- при длительных операциях надо специальным вызовом давать возможность рантайму немного поработать.
|
|
|
|
|
|
-При соблюдении первых трёх правил -- в четвёртом случае ничего и не получится. Но часто придётся работать с каналами, которые не подчиняются первым трём правилам. Об это стоит помнить.
|
|
|
+При соблюдении первых трёх правил -- в других случаях ничего плохого не случится. Но часто придётся работать с каналами, которые не подчиняются первым трём правилам. Об этом стоит помнить.
|
|
|
|
|
|
## Неявные правила работа с данными
|
|
|
|
|
|
Мало передать структуры и данные через каналы, чтобы избежать гонок данных.
|
|
|
|
|
|
-Надо понимать, что как только данные попали в канал _по ссылке_ -- теперь есть две ссылки,которые указывают на одни и теже данные.
|
|
|
+Надо понимать, что как только данные попали в канал _по ссылке_ -- теперь есть _две ссылки_, которые указывают на _одни и теже данные_.
|
|
|
|
|
|
Поэтому два железных правила:
|
|
|
|
|
|
@@ -122,15 +122,15 @@ if countMsg == 0{
|
|
|
### Что не так с длиной канала
|
|
|
|
|
|
Проблема в том, что в канал пишет один поток, а длину (обычно) проверяет другой.
|
|
|
-И пока второй поток что-то делает с каналом -- первый в это время может ещё дописать данных.
|
|
|
+И пока второй поток что-то делает с каналом -- первый в это время может ещё дописать данных. Или другой поток может прочитать данные из этого же канала.
|
|
|
|
|
|
**На текущую длину канала в потребителе полагаться нальзя!**
|
|
|
|
|
|
Единственный надёжный метод -- итерация по каналу в цикле.
|
|
|
|
|
|
-## Примеры
|
|
|
+## Пример
|
|
|
|
|
|
-Первый пример показывает:
|
|
|
+Пример показывает:
|
|
|
|
|
|
- как правильно создать канал;
|
|
|
- как правильно читать из канала;
|
|
|
@@ -161,4 +161,4 @@ func runReader (chProd <-chan int){
|
|
|
|
|
|
chProd := runWriter()
|
|
|
runReader(chProd)
|
|
|
-```
|
|
|
+```
|