Возможность НЕ подключать всю доступную мощность процессора? - PullRequest
0 голосов
/ 24 октября 2018

Я знаю, что большинство новичков спрашивают, как получить эффективные процедуры / параллелизм, этот пункт я пропустил несколько недель назад.: -)

У меня действительно быстрый транскодер, который использует каждый доступный цикл моего 4 + 4 (i7 HT) процессора.Он читает файл в виде фрагментов указателей на структуры, выполняет их вычисления и записывает результат обратно на диск.Я использую Bufio.Я прихожу из VB, поэтому производительность Go невероятна.

Я пытался добавить минимальное количество снов (через time.Sleep ()), но это резко снизило производительность.

Хотя мой транскодер работает вся система отстает.Я должен изменить приоритет задачи go на низкий или бездействующий, чтобы иметь возможность снова работать.

Как я могу реализовать что-то, что поддерживает отзывчивость системы?

Прямо сейчас я запускаю тысячи go-рутин(цикл над ломтиком указателей).Должен ли я ограничить количество процедур?

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

Вероятно, самое простое решение - это ограничить число одновременных подпрограмм с помощью семафора, например:

sem := make(chan int, 10) // limited at go routines 

for {
    sem <- 1
    go doThis()
}

func doThis() {
    //do this
    <- sem
}

"sem <- 1" внутри блоков цикла for, пока "слот" для подпрограммы не будетосвобождается путем этого извлечения чего-то из sem-канала / </p>

0 голосов
/ 24 октября 2018

Понижение приоритета процесса, возможно, является правильным способом сделать это.Используйте планировщик вашей ОС.Вот для чего это. По этому вопросу вы можете запустить процесс с указанным приоритетом, например так:

start "MyApp" /low "C:\myapp.exe"

Вы можете также иметь возможность устанавливать приоритет процесса из приложения за этот вопрос :

err := syscall.Setpriority(syscall.Getpid(), -1, -1)

Наконец, вы можете использовать GOMAXPROCS, чтобы настроить, сколько процессоров разрешено использовать процессу.Вы можете передать его как переменную среды во время выполнения или вызвать runtime.GOMAXPROCS() в вашем коде, чтобы переопределить его.

...