[b/docs/gitfame_review_comments.md] Add note on goroutines.
This commit is contained in:
parent
7bc0c1f9b9
commit
2495017852
1 changed files with 25 additions and 2 deletions
|
@ -118,7 +118,7 @@ js := fmt.Sprintf("{\"name\":\"%s\",\"lines\":%d,\"commits\":%d,\"files\":%d}",
|
||||||
```
|
```
|
||||||
|
|
||||||
Правильно:
|
Правильно:
|
||||||
```
|
```golang
|
||||||
import "encoding/json"
|
import "encoding/json"
|
||||||
|
|
||||||
js, err := json.Marshal(info)
|
js, err := json.Marshal(info)
|
||||||
|
@ -246,7 +246,7 @@ var (
|
||||||
## Вывод результатов
|
## Вывод результатов
|
||||||
|
|
||||||
Вместо
|
Вместо
|
||||||
```
|
```golang
|
||||||
os.Stdout.Write(bytes)
|
os.Stdout.Write(bytes)
|
||||||
fmt.Println()
|
fmt.Println()
|
||||||
```
|
```
|
||||||
|
@ -261,3 +261,26 @@ os.Stdout.Write(fmt.Sprintf("%s\n"), string(bytes))
|
||||||
```golang
|
```golang
|
||||||
fmt.Println(string(bytes))
|
fmt.Println(string(bytes))
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Работа с горутинами
|
||||||
|
|
||||||
|
Часто встречается подобная конструкция с бесконтрольной параллелизацией:
|
||||||
|
|
||||||
|
```golang
|
||||||
|
ch := make(chan struct{}, len(files))
|
||||||
|
for _, file := range files {
|
||||||
|
go blame(file, ch)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
На большом репозитории одновременно будет зашущено неопределённое количество горутин и подпроцессов.
|
||||||
|
|
||||||
|
Во-первых, каждая горутина требует сколько-то килобайт на стэк и потенциально может закончиться память.
|
||||||
|
|
||||||
|
Во-вторых, в OS есть ограничение на количество процессов + каждый процесс потребляет сколько-то системных ресурсов (ram, cpu) и суммарное потребление может оказаться неопределённо большим.
|
||||||
|
|
||||||
|
Вместо этого стоит явно ограничить количество одновременно запущенных горутин-воркеров, обрабатывающих blame, константой с небольшим дефолтом (8), либо дополнительно можно вынести степень параллелизации за флаг.
|
||||||
|
|
||||||
|
Прочитайте [пост в go блоге](https://go.dev/blog/pipelines) про типичные pipeline паттерны.
|
||||||
|
|
||||||
|
Можно сделать одного producer'а workload'а, который будет писать файлы для обработки в канал фиксированного размера, а `n` worker'ов будут читать из этого общего канала и обрабатывать файлы.
|
||||||
|
|
Loading…
Reference in a new issue