#go
#Вперед
Вопрос:
Анализируя этот стандартный код из документации (https://pkg.go.dev/os/exec#example-Cmd.Run )
package main
import (
"log"
"os/exec"
)
func main() {
cmd := exec.Command("sleep", "1")
log.Printf("Running command and waiting for it to finish...")
err := cmd.Run()
log.Printf("Command finished with error: %v", err)
}
Я заметил, что при выполнении внешней команды создаются дополнительные потоки (1494, 1495, 1496, 1497)? Для чего они нужны, можно ли их как-то избежать?
$ ./s
$ pstree -ap
| |-bash,19563
| | `-s,1493
| | |-sleep,1498 60
| | |-{s},1494
| | |-{s},1495
| | |-{s},1496
| | `-{s},1497
Комментарии:
1. Среда выполнения Go порождает поток всякий раз, когда это необходимо, и не находится под вашим контролем. Какую проблему вы пытаетесь решить?
2. У меня есть несколько пользователей на моих серверах, которые имеют ограниченное максимальное количество возможных процессов (RLIMIT_NPROC), и они используют мою программу go, которая запускает внешнюю программу в зависимости от настроек пользователя. Поскольку при учете ресурсов ядро Linux приравнивает поток к процессу, то у пользователя остается не так много ресурсов, чтобы запустить что-то еще.
3. К сожалению, если они используют Go, любой заблокированный поток создаст другой, чтобы гарантировать, что GOMAXPROCS всегда поддерживается. Вероятно, это следует решить, отрегулировав ограничения ресурсов на сервере, но они также могут установить GOMAXPROCS на меньшее значение, чем значение по умолчанию, чтобы обеспечить некоторые дополнительные потоки.
4. При GOMAXPROCS= 1 количество потоков уменьшается с 4 до 2, но, к сожалению, для меня это все еще много. По-видимому, необходимо переписать программу на другом языке. В любом случае спасибо за комментарии.