Go语言进阶第03天(协程,并行与通道)

1.go go程

package main

import (
	"fmt"
	"time"
)

func sing() {
    
    
	for i := 0; i < 50; i++ {
    
    
		fmt.Println("----正在唱:隔壁泰山----")
		time.Sleep(100 * time.Millisecond)
	}
}

func dance() {
    
    
	for i := 0; i < 50; i++ {
    
    
		fmt.Println("----正在跳舞:赵四街舞----")
		time.Sleep(100 * time.Millisecond)
	}
}

func main02() {
    
    
	go sing()
	dance()

}

2.Goroutine 子go程

package main

import (
	"fmt"
	"time"
)

func main03() {
    
    

	go func() {
    
     // 创建一个 子go 程
		for i := 0; i < 5; i++ {
    
    
			fmt.Println("------I'm goroutine -------")
			time.Sleep(time.Second)
		}
	}()

	fmt.Println("------I'm main-------")

	for i := 0; i < 5; i++ {
    
     // 主 go 程

		fmt.Println("------I'm main-------")
		time.Sleep(time.Second)
		if i == 2 {
    
    
			break
		}
	}

}

3.Gosched 让出时间片

package main

import (
	"fmt"
	"runtime"
)

func main04() {
    
    

	go func() {
    
    
		for {
    
    
			fmt.Println(" this is goroutine test")
		}
	}()

	for {
    
    
		runtime.Gosched() // 出让当前 cpu 时间片。
		fmt.Println(" this is main test")
	}
}

4.Goexit 结束go程

package main

import (
	"fmt"
	"runtime"
)

func test() {
    
    
	defer fmt.Println("ccccccccccccccccc")
	//return
	runtime.Goexit() // 退出当前go程。
	defer fmt.Println("ddddddddddddddddd")
}

func main05() {
    
    

	go func() {
    
    
		defer fmt.Println("aaaaaaaaaa")
		test()
		fmt.Println("bbbbbbbbbbbbb")
	}()

	for {
    
    

	}
}

5.GOMAXPROCS CPU核数控制

package main

import (
	"fmt"
	"runtime"
)

func main06() {
    
    

	// fmt.Println(runtime.GOROOT())

	// n := runtime.GOMAXPROCS(0) //将cpu设置为 单核
	// fmt.Println("n = ", n)

	a := runtime.NumCPU() //查询CPU最大核数
	fmt.Println(a)
	n := runtime.GOMAXPROCS(2) //将cpu设置为 双核
	fmt.Println("n = ", n)

	// n = runtime.GOMAXPROCS(2)  //将cpu设置为 双核
	// fmt.Println("n = ", n)
	for {
    
    
		go fmt.Print(0) // 子go 程
		runtime.Gosched()
		fmt.Print(1) // 主 go 程
	}
}

6.channel 通道,阻塞控制

package main

import (
	"fmt"
	"runtime"
	"time"
)

//channel  通道数据类型
//channel  两种类型,有缓冲,无缓冲
//channel  三种定义模式
// 	1.写操作模式  make(chan<- int)
// 	2.读操作模式  make(<-chan int)
// 	3.读写操作模式  make(chan int)
// channel  三种状态  未初始化、正常、关闭
// 				未初始化				关闭				  					  正常
// 	关闭		panic				   panic								   正常关闭
// 	发送		永远阻塞导致死锁		panic									阻塞或者成功发送
// 	接收		永远阻塞导致死锁		缓冲区为空则为零值, 否则可以继续读		  阻塞或者成功接收

// 注意点:
// 一个 channel不能多次关闭,会导致painc
// 如果多个 goroutine 都监听同一个 channel,那么 channel 上的数据都可能随机被某一个 goroutine 取走进行消费
// 如果多个 goroutine 监听同一个 channel,如果这个 channel 被关闭,则所有 goroutine 都能收到退出信号

// 全局定义channel, 用来完成数据同步
var channel = make(chan int)

// 定义一台打印机
func printer(s string) {
    
    
	for _, ch := range s {
    
    
		fmt.Printf("%c", ch) // 屏幕:stdout
		time.Sleep(300 * time.Millisecond)
	}
}

// 定义两个人使用打印机
func person1() {
    
     // person 先执行。
	printer("hello")
	close(channel)
}
func person2() {
    
     // person 后执行
	<-channel
	printer("wrold\n")
}

func main() {
    
    
	go person1()
	go person2()
	runtime.Goexit()
}

猜你喜欢

转载自blog.csdn.net/qq_51685718/article/details/127695818