Je penche pour l'option "go", ce qui peut être une question stupide.
Je n'arrive pas à comprendre pourquoi l'une de mes routines est bloquée par une autre. Si j'ai bien compris (je peux me tromper), les routines go s'exécutent comme des threads légers indépendants et ne devraient donc pas se bloquer l'une l'autre, à moins que je me sois trompé :)
J'ai collé le code ci-dessous et j'apprécierais toute aide ou conseil pour résoudre ce problème.
package main
import "fmt"
import "time"
import "sync"
func worker( jobs <-chan int, job2 chan<- int) {
defer wg.Done()
for j := range jobs {
fmt.Println("finished job", j)
time.Sleep(time.Second/2)
if(j%3==0){
job2 <- j
}
}
close(job2)
fmt.Println("channel job2 closed")
}
func worker2(job2 <-chan int) {
defer wg.Done()
for i:= range job2 {
fmt.Println(i)
time.Sleep(time.Second*10)
}
}
var wg sync.WaitGroup
func main() {
wg.Add(2)
jobs := make(chan int)
job2 := make(chan int)
go func() {
for j := 1; j <= 10; j++ {
jobs <- j
}
close(jobs)
fmt.Println("channel jobs closed")
}()
go worker(jobs,job2)
go worker2(job2)
wg.Wait()
fmt.Println("exiting main")
}
J'obtiens le résultat suivant lorsque j'exécute ce code
finished job 1
finished job 2
finished job 3
finished job 4
3
finished job 5
finished job 6
6
finished job 7
finished job 8
finished job 9
9
finished job 10
channel jobs closed
channel job2 closed
exiting main
Mais je m'attendais à quelque chose comme ça ?
finished job 1
finished job 2
finished job 3
finished job 4
3
finished job 5
finished job 6
finished job 7
finished job 8
finished job 9
finished job 10
channel jobs closed
6
9
channel job2 closed
exiting main