• Go用两个协程交替打印100以内的奇偶数


    方式1(使用无缓冲的channel)

    package main
    
    import (
    	"fmt"
    	"time"
    )
    
    var flagChan = make(chan int)
    
    func wokr1() {
    	for i := 1; i <= 100; i++ {
    		flagChan <- 666 // 塞入
    		if i%2 == 1 {
    			fmt.Println("协程1打印:", i)
    		}
    	}
    }
    
    func wokr2() {
    	for i := 1; i <= 100; i++ {
    		_ = <-flagChan // 取出
    		if i%2 == 0 {
    			fmt.Println("协程2打印:", i)
    		}
    	}
    }
    
    func main() {
    	go wokr1()
    	go wokr2()
    
    	time.Sleep(3 * time.Second) // 可以通过sync.WaitGroup或者另外一个channel来控制主协程的退出
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    两个协程,一个channel,把这个无缓冲的channel当成一把锁使用(起阻塞作用)

    或者使用闭包方式,如下(与上面方式一样)

    package main
    
    import (
    	"fmt"
    	"time"
    )
    
    func main() {
    	c := make(chan int)
    	go func() {
    		for i := 1; i < 101; i++ {
    			c <- 666
    			//奇数
    			if i%2 == 1 {
    				fmt.Println("协程1打印:", i)
    			}
    		}
    	}()
    	go func() {
    		for i := 1; i < 101; i++ {
    			<-c
    			//偶数
    			if i%2 == 0 {
    				fmt.Println("协程2打印:", i)
    			}
    		}
    	}()
    	time.Sleep(3 * time.Second)
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    方式2(设置GOMAXPROCS=1)

    package main
    
    import (
    	"fmt"
    	"runtime"
    	"time"
    )
    
    func main() {
    	//设置可同时使用的CPU核数为1
    	runtime.GOMAXPROCS(1)
    	go func() {
    		for i := 1; i < 101; i++ {
    			//奇数
    			if i%2 == 1 {
    				fmt.Println("协程1打印:", i)
    			}
    			//让出cpu
    			runtime.Gosched()
    		}
    	}()
    	go func() {
    		for i := 1; i < 101; i++ {
    			//偶数
    			if i%2 == 0 {
    				fmt.Println("协程2打印:", i)
    			}
    			//让出cpu
    			runtime.Gosched()
    		}
    	}()
    	time.Sleep(3 * time.Second)
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    借此可以搞清楚*runtime.GOMAXPROCS(1)和runtime.Gosched()*的使用方式

    交替打印切片中奇偶数位元素的值

    package main
    
    import (
    	"fmt"
    	"time"
    )
    
    func main() {
    
    	sli := make([]int, 100)
    	for k := 0; k < 100; k++ {
    		sli[k] = k * 10
    	}
    
    	// 交替打印sli这个切片中奇偶数位元素的值
    	// fmt.Println(len(sli)) //100
    
    	c := make(chan int)
    	go func() {
    		for i := 0; i < len(sli); i++ {
    			c <- 666
    			//奇数
    			if i%2 == 1 {
    				fmt.Println("协程1打印:", sli[i])
    			}
    		}
    	}()
    	go func() {
    		for i := 0; i < len(sli); i++ {
    			<-c
    			//偶数
    			if i%2 == 0 {
    				fmt.Println("协程2打印:", sli[i])
    			}
    		}
    	}()
    	time.Sleep(3 * time.Second)
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
  • 相关阅读:
    基于云服务器 EC2 的云上堡垒机的设计和自动化实现
    Ubuntu本地快速搭建web小游戏网站,公网用户远程访问【内网穿透】
    六千字带你快速上手操作MySQL
    哪个编程语言实现hello world最烦琐?
    时序预测 | Python实现ARIMA-CNN-LSTM差分自回归移动平均模型结合卷积长短期记忆神经网络时间序列预测
    JavaSPI详解
    【JavaEE初阶】 计算机是如何工作的
    按键精灵调用大漠插件源码例子
    java168-java连接SQL server数据库
    3种模型之间的关系,对象模型定义了做事情的实体。
  • 原文地址:https://blog.csdn.net/m0_73728511/article/details/133777007