Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
package main
import (
"fmt"
"sync"
)
const N = 2000000000
const T = 8
func DoLong(msg string, group *sync.WaitGroup) (ret uint64) {
fmt.Printf("Start: %v\n", msg)
for i := 0; i < N; i++ {
ret++
}
fmt.Printf("End: %v\n", msg)
group.Done()
return ret
}
func main() {
group := &sync.WaitGroup{}
group.Add(T)
for i := 0; i < T; i++ {
go DoLong(fmt.Sprintf("thread %v", i), group)
}
group.Wait()
}
Start: thread 0
End: thread 0
Start: thread 1
End: thread 1
Start: thread 2
End: thread 2
Start: thread 3
End: thread 3
...
Однако, если в вашем примере поставить, скажем GOMAXPROCS=8, то все потоки стартуют одновременно и не ждут друг друга.К сожалению, нет. GOMAXPROCS устанавливает лишь верхний предел, который среда исполнения не обязана использовать полностью. Например, на моей машинке с 2-я ядрами с GOMAXPROCS=8 и даже 12 сразу стартует только 5 горутин, остальные ждут.
А если делать gui для какой-то многопоточной процессороемкой операции, то без отдельного процесса даже кнопку с паузой не получится сделать.Если сильно постараться, то можно: runtime.Gosched.
В текущем виде Go плохо годится именно для параллельных вычисленийИменно для параллельных вычислений Go годится вполне :) В вычислениях ведь не важно, началось ли исполнение какой-то горутины сразу или через 5 минут, важно насколько быстро всё закончится.
Чтобы, допустим, веб-сервер просто принимал запрос и клал его в очередь, пока горутины доберутся до его обработки.А зачем принимать запрос, если собираешься только класть его в очередь? Уже есть очередь на прием запросов в listen (Server socket queue length). Если очередь переполняется, то значит, производительности сервера не хватает в принципе. Зачем дополнительно городить еще свою собственную очередь?
nodejs но без callback hell
Теплый и ламповыйточно!
Какие управляющие слои и слои инфраструктуры новейших технологий будут использоваться для обеспечения функционирования облачных сервисов? В течение двух лет большинство из них будет написано на Go
Go компилируется в один статический бинарный файл. Развертывание — это просто загрузка файл на сервер и его запуск. Не требуется установка дополнительных зависимостей.Я успел запустить только один проект (и тот небольшой) в production на Golang, но то, что Golang компилирует в один статический бинарный файл — это просто супер охренненая фича, очень и очень упрощающая процесс развертывания.
не знал, что оно скриптовое, мой косяк. читал, что компилируемый языкДа, компилируемый. Но не для всякого компилируемого языка сборка — PITA. Для Go есть удобная команда-обертка, которая собирает и запускает в одном флаконе. Учитывая скорость сборки, по ощущениям не сильно отличается от скриптового языка, но при этом менее компилируемым не становится.
Go: Два года в продакшне