Интересует несколько вопросов.
1. runtime.Gosched() - есть ли практическое применение этого метода?
2. runtime.GOMAXPROCS(1) - есть ли практическое применение этого метода?
На форумах читал, что использование этих методов, признак плохой архитектуры, в теории для чего они могут применяться?
Я вижу что меняется поведение горутин, но не могу найти логики в этом.
3. worketInput := make(chan string, 2) - что будет при увеличении канала?
package main
import (
"fmt"
"log"
"strings"
"time"
)
const goroutinesNum = 5
func startWorker(workerNum int, in <-chan string) {
// обрабатываем канал горутинами
for input := range in {
time.Sleep(time.Second)
fmt.Printf(formatWork(workerNum, input))
//runtime.Gosched() // <- ЭТО
}
printFinishWork(workerNum)
}
func main() {
//runtime.GOMAXPROCS(1) // // <- ЭТО с 0 (все доступные) и 1
worketInput := make(chan string, 2) // <- Что будет при увеличении канала
// Запускаем горутины, которые начинают слушать канал worketInput
for i := 0; i < goroutinesNum; i++ {
log.Println("FOR GO")
go startWorker(i, worketInput)
}
// пользователи
log.Println("START")
users := []string{"Дмитрий", "Петр", "Василий",
"Сергей", "Иван", "Влад",
}
// В канал складываем пользователей
for _, userName := range users {
worketInput <- userName
}
close(worketInput) // <- закрываем
fmt.Scanln()
}
func formatWork(in int, input string) string {
return fmt.Sprintln(strings.Repeat(" ", in), "█",
strings.Repeat(" ", goroutinesNum-in),
"th", in,
"recieved", input)
}
func printFinishWork(in int) {
fmt.Println(strings.Repeat(" ", in), "█",
strings.Repeat(" ", goroutinesNum-in),
"===", in,
"finished")
}