Go主线程:一个Go线程上,可以起多个协程,协程是轻量级的线程
package main import ( "fmt" "runtime" "strconv" "time" ) func main() { //编写一个函数,每隔1s输出"hello,world" //要求主线程和gorutine同时执行 go test() //在主线程中,开启一个goroutine,该协程每隔1s输出"hello,world" for i:=1;i<=10 ; i++ { fmt.Println("main() hello world", strconv.Itoa(i)) time.Sleep(time.Second) } //查询Golang运行的cpu数 fmt.Println(runtime.NumCPU()) //4 //设置Golang运行的cpu数 //runtime.GOMAXPROCS(runtime.NumCPU()-1) //3 } func test(){ for i:=1;i<=10 ; i++ { fmt.Println("test() hello world",strconv.Itoa(i)) time.Sleep(time.Second) } }
使用全局变量加锁同步改进程序
使用内置函数close可以关闭channel,关闭后,就不能写入数据,但可读
代码
package main import "fmt" func main() { //定义管道 var intChan chan int intChan =make(chan int,3) //写入数据 intChan<-10 intChan<-20 intChan<-30 //遍历 close(intChan) //关闭管道 for value := range intChan { fmt.Printf("%d\t",value) //10 20 30 } }
-`channel可以声明为只读,或者只写性质
package main import "fmt" func main() { numChan := make(chan int, 2000) resChan := make(chan int, 2000) exitChan := make(chan bool, 8) go putNum(numChan) //存放数据 //开启八个协程 for i := 0; i < 8; i++ { go add(numChan, resChan, exitChan) } go func() { for i:=0;i<8 ;i++ { <-exitChan } close(resChan) }() for i := 1; i <=2000 ; i++ { fmt.Printf("resChan[%d]=%d\n", i, <-resChan) } } func putNum(numChan chan int) { for i := 1; i <= 2000; i++ { numChan <- i } close(numChan) } func add(numChan chan int, resChan chan int, exitChan chan bool) { for { n,ok := <-numChan if !ok{ break } res := 0 for i := 1; i <= n; i++ { res += i } resChan <- res } exitChan<-true }