golang 并发控制
1. 信号量控制
package main
import (
"sync"
"time"
)
func main ( ) {
wg := sync. WaitGroup{ }
wg. Add ( 2 )
go func ( ) {
time. Sleep ( 1 * time. Second)
println ( "stopping first goroutine1 ..." )
wg. Done ( )
} ( )
go func ( ) {
time. Sleep ( 2 * time. Second)
println ( "stopping first goroutine2 ..." )
wg. Done ( )
} ( )
wg. Wait ( )
println ( "finally all are done" )
}
2. context 控制
2.1 context with cancel
package main
import (
"context"
"time"
)
func handle1 ( context context. Context) {
for {
select {
case <- context. Done ( ) :
println ( "handle1 exit" )
return
default :
println ( "running handle1" )
time. Sleep ( 1 * time. Second)
}
}
}
func handle2 ( context context. Context) {
for {
select {
case <- context. Done ( ) :
println ( "handle2 exit" )
return
default :
println ( "running handle2" )
time. Sleep ( 2 * time. Second)
}
}
}
func main ( ) {
ctx, cancel := context. WithCancel ( context. Background ( ) )
go handle1 ( ctx)
go handle2 ( ctx)
time. Sleep ( 5 * time. Second)
cancel ( )
}
2.2 context with value
package main
import (
"context"
"fmt"
"time"
)
func f1 ( context context. Context) {
fmt. Println ( "param is " , context. Value ( "param" ) )
}
func main ( ) {
ct := context. WithValue ( context. Background ( ) , "param" , "1" )
go f1 ( ct)
time. Sleep ( 3 * time. Second)
}
2.3 context with timeout
package main
import (
"context"
"time"
)
func time1 ( c context. Context) {
for {
select {
case <- c. Done ( ) :
println ( "auto exit" )
return
default :
println ( "running " )
time. Sleep ( 1 * time. Second)
}
}
}
func main ( ) {
ctx, cancel := context. WithTimeout ( context. Background ( ) , 4 * time. Second)
go time1 ( ctx)
time. Sleep ( 5 * time. Second)
cancel ( )
}
2.4 context with deadline