Golang语言并行设计的核心goroutine

[复制链接]
frankphper 发表于 2019-5-8 09:51:58 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
goroutine实现并发编程,goroutine之间通信使用channel,channel不管是发送数据还是接收数据都是阻塞的,channel默认无缓冲,但也可以指定缓冲大小变成有缓冲,空间有剩余时是无阻塞,直到空间全部用完时才阻塞。
  1. /**
  2. * goroutine实现并发编程
  3. * goroutine之间通信使用channel
  4. * channel不管是发送数据还是接收数据都是阻塞的
  5. * channel默认无缓冲,但也可以指定缓冲大小变成有缓冲,空间有剩余时是无阻塞,直到空间全部用完时才阻塞
  6. */
  7. package main

  8. import (
  9.     "fmt"
  10. )

  11. func sum(a []int, c chan int) {
  12.     total := 0
  13.     for _, v := range a {
  14.         total += v
  15.     }
  16.     // 发送total到c
  17.     c <- total
  18. }
  19. func fibonacci(n int, c chan int) {
  20.     x, y := 1, 1
  21.     for i := 0; i < n; i++ {
  22.         // 发送x到c
  23.         c <- x
  24.         x, y = y, x+y
  25.     }
  26.     // 通过内置函数close关闭channel
  27.     close(c)
  28. }
  29. func main() {
  30.     a := []int{9, 2, 6, -5, 3, 0}
  31.     // 使用make创建channel,默认无缓冲,阻塞
  32.     c := make(chan int)
  33.     // 使用go关键字启动goroutine
  34.     go sum(a[:len(a)], c)
  35.     go sum(a[len(a)/2:], c)
  36.     // 从c中接收数据
  37.     x, y := <-c, <-c
  38.     fmt.Println(x, y, x+y)
  39.     // 使用make创建有缓冲的channel,空间有剩余时是无阻塞,直到空间全部用完时才阻塞
  40.     // 修改2为1则报错,修改2为3则正常
  41.     c1 := make(chan int, 2)
  42.     c1 <- 1
  43.     c1 <- 2
  44.     fmt.Println(<-c1)
  45.     fmt.Println(<-c1)
  46.     c2 := make(chan int, 10)
  47.     // 使用go关键字启动goroutine
  48.     go fibonacci(cap(c2), c2)
  49.     // 使用range读取channel
  50.     for i := range c2 {
  51.         fmt.Println(i)
  52.     }
  53. }
复制代码


*滑动验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则