go學習-併發

初始化

package main

import (
	"fmt"
)

func main() {
	c := make(chan bool)
	go func() {
		fmt.Println("go go go ")
		c <- true
	}()
	<-c
}

for遍歷channel,必須明確關閉,避免死鎖

package main

import (
	"fmt"
)

func main() {
	c := make(chan bool)
	go func() {
		fmt.Println("go go go ")
		c <- true
		close(c)
	}()
	for v := range c {
		fmt.Println(v)
	}
}

對於多個gorountine,確保每個都能被執行,可通過賦予channel緩衝的形式來,確保所有執行

package main

import (
	"fmt"
	"runtime"
)

func main() {
	runtime.GOMAXPROCS(runtime.NumCPU())
	c := make(chan bool, 10)
	for i := 0; i < 10; i++ {
		go Go(c, i)
	}
	for i := 0; i < 10; i++ {
		<-c
	}
}

func Go(c chan bool, index int) {
	a := 1
	for i := 0; i < 10000000; i++ {
		a += 1
	}
	fmt.Println(index, a)
	c <- true
}

通過sync包實現多個gorountine執行

package main

import (
	"fmt"
	"runtime"
	"sync"
)

func main() {
	runtime.GOMAXPROCS(runtime.NumCPU())
	wg := sync.WaitGroup{}
	wg.Add(10)
	for i := 0; i < 10; i++ {
		go Go(&wg, i)
	}
	wg.Wait()
}

func Go(wg *sync.WaitGroup, index int) {
	a := 1
	for i := 0; i < 10000000; i++ {
		a += 1
	}
	fmt.Println(index, a)
	wg.Done()
}

select 循環讀取channel

package main

import (
	"fmt"
)

func main() {
	c1, c2 := make(chan int), make(chan string)
	go func() {
		for {
			select {
			case v, ok := <-c1:
				if !ok {
					break
				}
				fmt.Println("c1:", v)
			case v, ok := <-c2:
				if !ok {
					break
				}
				fmt.Println("c2:", v)
			}
		}
	}()

	c1 <- 0
	c2 <- "h1"

	close(c1)
	close(c2)
}

select 循環讀入

package main

import (
	"fmt"
)

func main() {
	c := make(chan int)

	go func() {
		for {
			select {
			case c <- 0:
			case c <- 1:
			}
		}
	}()

	for v := range c {
		fmt.Println(v)
	}

}

select過期

package main

import (
	"fmt"
	"time"
)

func main() {
	c := make(chan int)

	select {
	case v := <-c:
		fmt.Println(v)
	case <-time.After(3 * time.Second):
		fmt.Println("timeout")
	}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章