Parallel for loop
•
Java
I want to use the go routine to parallelize the for loop I tried to use the channel, but it didn't work My main problem is that I want to wait for all iterations to complete before continuing That's why it doesn't work until it's simply written I tried to use the channel (I think it was the wrong way), but it made my code slower
func createPopulation(populationSize int,individualSize int) []Individual {
population := make([]Individual,populationSize)
//i want this loop to be work parallel
for i := 0; i < len(population); i++ {
population[i] = createIndividual(individualSize)
}
return population
}
func createIndividual(size int) Individual {
var individual = Individual{make([]bool,size),0}
for i := 0; i < len(individual.gene); i++ {
if rand.Intn(2)%2 == 1 {
individual.gene[i] = true
} else {
individual.gene[i] = false
}
}
return individual
}
My structure looks like this:
type Individual struct {
gene []bool
fitness int
}
Solution
So basically goroutine should not return a value, but push it to a channel If you want to wait for all goroutines to complete, you can only calculate the number of goroutines, or use waitgroup In this case, it's an overreaction because its size is well known, but it's a good practice anyway This is a modified example:
package main
import (
"fmt"
"math/rand"
"sync"
)
type Individual struct {
gene []bool
fitness int
}
func createPopulation(populationSize int,individualSize int) []Individual {
// we create a slice with a capacity of populationSize but 0 size
// so we'll avoid extra unneeded allocations
population := make([]Individual,populationSize)
// we create a buffered channel so writing to it won't block while we wait for the waitgroup to finish
ch := make(chan Individual,populationSize)
// we create a waitgroup - basically block until N tasks say they are done
wg := sync.WaitGroup{}
for i := 0; i < populationSize; i++ {
//we add 1 to the wait group - each worker will decrease it back
wg.Add(1)
//Now we spawn a goroutine
go createIndividual(individualSize,ch,&wg)
}
// Now we wait for everyone to finish - again,not a must.
// you can just receive from the channel N times,and use a timeout or something for safety
wg.Wait()
// we need to close the channel or the following loop will get stuck
close(ch)
// we iterate over the closed channel and receive all data from it
for individual := range ch {
population = append(population,individual)
}
return population
}
func createIndividual(size int,ch chan Individual,wg *sync.WaitGroup) {
var individual = Individual{make([]bool,0}
for i := 0; i < len(individual.gene); i++ {
if rand.Intn(2)%2 == 1 {
individual.gene[i] = true
} else {
individual.gene[i] = false
}
}
// push the population object down the channel
ch <- individual
// let the wait group kNow we finished
wg.Done()
}
The content of this article comes from the network collection of netizens. It is used as a learning reference. The copyright belongs to the original author.
THE END
二维码
