1、Golang使用2個goroutine分別打印奇偶數,順序輸出1-10
package main
import (
"fmt"
"sync"
"time"
)
var wg sync.WaitGroup
func main() {
ch := make(chan struct{})
wg.Add(2)
go printOdd(ch)
go printEven(ch)
wg.Wait()
}
func printOdd(ch chan struct{}) {
defer wg.Done()
for i:=1;i<=9;i+=2 {
time.Sleep(time.Second)
fmt.Println(i)
ch <- struct{}{}
}
}
func printEven(ch chan struct{}) {
defer wg.Done()
for i:=2;i<=10;i+=2 {
<-ch
time.Sleep(time.Second)
fmt.Println(i)
}
}
2、對goroutine實現每秒并發(fā)請求數限制
簡單的實現,實際應用中可以采用令牌桶限流
package main
import (
"fmt"
"time"
)
func main() {
if err:=recover();err!=nil {
fmt.Println(err)
}
tick1 := time.NewTicker(time.Second)
ch := make(chan struct{},3)
for {
select {
case <-tick1.C:
for i:=0;i<=100000;i++ {
ch<- struct{}{}
go func() {
if err:=recover();err!=nil {
fmt.Println(err)
}
fmt.Println("xxx")
time.Sleep(time.Second)
<-ch
}()
}
}
}
}
3、Go實現兩個goroutine交替打印切片并實現超時控制
func PrintArray(list []int, timeout float64) {
ctx, cancel := context.WithTimeout(context.Background(), time.Second*time.Duration(timeout))
defer cancel()
allow := make(chan bool)
finish := make(chan struct{})
go func() {
for i := 0; i < len(list); i++ {
allow <- true
time.Sleep(time.Second)
if i%2 == 0 {
fmt.Println("goroutine-1:", list[i])
}
}
finish <- struct{}{}
}()
go func() {
for i := 0; i < len(list); i++ {
<-allow
if i%2 == 1 {
fmt.Println("goroutine-2:", list[i])
}
}
finish <- struct{}{}
}()
finishCount := 0
for {
select {
case <-ctx.Done():
fmt.Println("timeout")
return
case <-finish:
finishCount += 1
if finishCount == 2 {
return
}
}
}
}
4、實現多個協(xié)程按順序打印數字
func main() {
a := 0
fn := func() int {
a++
return a
}
ch := make(chan int, 1)
finish := make(chan int, 3)
for i := 0; i < 3; i++ {
go func(j int) {
for {
ch <- 1
n := fn()
if n > 100 {
finish <- 1
<-ch
return
}
fmt.Println("go", j, n)
<-ch
}
}(i)
}
for i := 0; i < 3; i++ {
<-finish
}
}
5、實現每秒打印一次,并且程序不會中斷
//題目:原題這樣
func main() {
go func(){
//在這里寫實現的代碼
}()
select{}
}
func proc() {
panic("this is a error")
}
//實現:實現這樣
func main() {
go func() {
ticker := time.NewTicker(time.Second)
for {
select {
case <-ticker.C:
go func() {
defer func() {
if err := recover(); err != nil {
fmt.Println(err)
}
}()
proc()
}()
}
}
}()
select {}
}
func proc() {
panic("this is a error")
}