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

简介: 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来控制主协程的退出
}

两个协程,一个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)
}

方式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)
}

借此可以搞清楚*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)
}
目录
相关文章
|
3月前
|
Go 调度 开发者
[go 面试] 深入理解进程、线程和协程的概念及区别
[go 面试] 深入理解进程、线程和协程的概念及区别
|
4月前
|
Java Go 调度
GO 协程
GO 协程
36 0
|
1月前
|
安全 Go 调度
探索Go语言的并发模式:协程与通道的协同作用
Go语言以其并发能力闻名于世,而协程(goroutine)和通道(channel)是实现并发的两大利器。本文将深入了解Go语言中协程的轻量级特性,探讨如何利用通道进行协程间的安全通信,并通过实际案例演示如何将这两者结合起来,构建高效且可靠的并发系统。
|
3月前
|
监控 Devops 测试技术
|
3月前
|
人工智能 Go
Go 等待协程完成
Go 等待协程完成
26 0
|
5月前
|
Go
如何在Go中进行文件操作以及如何使用协程来实现并发编程
如何在Go中进行文件操作以及如何使用协程来实现并发编程
71 2
|
6月前
|
安全 Go 调度
|
6月前
|
监控 负载均衡 算法
Golang深入浅出之-Go语言中的协程池设计与实现
【5月更文挑战第3天】本文探讨了Go语言中的协程池设计,用于管理goroutine并优化并发性能。协程池通过限制同时运行的goroutine数量防止资源耗尽,包括任务队列和工作协程两部分。基本实现思路涉及使用channel作为任务队列,固定数量的工作协程处理任务。文章还列举了一个简单的协程池实现示例,并讨论了常见问题如任务队列溢出、协程泄露和任务调度不均,提出了解决方案。通过合理设置缓冲区大小、确保资源释放、优化任务调度以及监控与调试,可以避免这些问题,提升系统性能和稳定性。
206 6
|
6月前
|
负载均衡 Go 调度
使用Go语言构建高性能的Web服务器:协程与Channel的深度解析
在追求高性能Web服务的今天,Go语言以其强大的并发性能和简洁的语法赢得了开发者的青睐。本文将深入探讨Go语言在构建高性能Web服务器方面的应用,特别是协程(goroutine)和通道(channel)这两个核心概念。我们将通过示例代码,展示如何利用协程处理并发请求,并通过通道实现协程间的通信和同步,从而构建出高效、稳定的Web服务器。
|
6月前
|
程序员 Go 数据处理