Погуглив я понял что в го все мои проблеммы решит воркер. Вот что я на говнокодил
package main
import "fmt"
import "sync"
import "time"
var wg sync.WaitGroup
func worker(id int, jobs <-chan int, results chan<- int) {
defer func() { wg.Done() }()
for j := range jobs {
fmt.Println("worker", id, "processing job", j)
time.Sleep(time.Second)
results <- j
}
}
func main() {
jobs := make(chan int, 100)
results := make(chan int, 100)
for w := 1; w <= 10; w++ {
wg.Add(1)
go worker(w, jobs, results)
}
for j := 1; j <= 90; j++ {
jobs <- j
}
for msg := range results {
fmt.Println("worker", msg)
}
wg.Wait()
close(jobs)
close(results)
fmt.Println("main finished")
}
После завершения кода сыпятся ошибки
fatal error: all goroutines are asleep - deadlock!
goroutine 1 [chan receive]:
main.main()
C:/Documents and Settings/lucifer/Рабочий ст
+0x12d
goroutine 5 [chan receive]:
main.worker(0x1, 0x10744000, 0x107441e0)
C:/Documents and Settings/lucifer/Рабочий ст
+0x66
created by main.main
C:/Documents and Settings/lucifer/Рабочий ст
+0xc3