Semaphore Pattern
This lesson explains an effective synchronization method that lets goroutines finish their execution first, also known as the semaphore pattern.
We'll cover the following...
Introduction
We can also use a channel for synchronization purposes, effectively using it as what is called a semaphore in traditional computing. To put it differently, to discover when a process (in a goroutine) is done, pass it a channel with which it can signal it is ready.
A common idiom used to let the main program block indefinitely while other goroutines run is to place select {}
as the last statement in the main
function. This can also be done by using a channel to let the main
program wait until the goroutine(s) complete(s), the so-called semaphore pattern.
Explanation
The goroutine compute
signals its completion by putting a value on the channel ch
, and the main routine waits on <-ch
until this value gets through.
On this channel, we would expect to get a result back, like in:
func compute(ch chan int) {
ch <- someComputation() // when it completes, signal on the channel.
}
func main() {
ch := make(chan int) // allocate a channel.
go compute(ch) // start something in a goroutine
doSomethingElseForAWhile()
result := <-ch
}
...