您现在的位置是:首页 > 学习笔记 > Go语言Go语言

Go并发

冰山2019-02-14【Go语言】人已围观

简介1.并发
1.1并发概述
1.2进程并发
1.3线程并发
1.4协程并发
1.5Go并发
2.Goroutine
2.1Goroutine定义
2.2Goroutine的创建
2.3Goroutine特性
3.channel管道
3.1定义channel变量
3.2无缓冲的channel
3.3有缓冲的channel
3.4关闭channel
4.读写锁与互斥锁
4.1死锁
4.2互斥锁
4.3读写锁


      defer fmt.Println("子go程结束")

      for i := 0; i < 3; i++ {
         c <- i
         fmt.Printf("子go程正在运行[%d]: len(c)=%d, cap(c)=%d\n", i, len(c), cap(c))
         }
      }()


   for i := 0; i < 3; i++ {
      num := <-c //从c中接收数据,并赋值给num
      fmt.Println("num = ", num)
      }
   fmt.Println("main进程结束")
}

输出结果:
len(c)=0, cap(c)=3
子go程正在运行[0]: len(c)=0, cap(c)=3
子go程正在运行[1]: len(c)=1, cap(c)=3
子go程正在运行[2]: len(c)=2, cap(c)=3
子go程结束
num =  0
num =  1
num =  2
main进程结束

Process finished with exit code 0
 

3.4关闭channel


如果发送者知道,没有更多的值需要发送到channel的话,那么让接收者也能及时知道没有多余的值可接收将是有用的,因为接收者可以停止不必要的接收等待。这可以通过内置的close函数来关闭channel实现。

示例:
package main

import (
   "fmt"
)

func main() {
   c := make(chan int)

   go func() {
      for i := 0; i < 5; i++ {
         c <- i
         }
      //把 close(c) 注释掉,程序会一直阻塞在 if data, ok := <-c; ok 那一行
      close(c)
      }()

   for {
      //ok为true说明channel没有关闭,为false说明管道已经关闭
      if data, ok := <-c; ok {
         fmt.Println(data)
         } else {
         break
         }
      }

   fmt.Println("Finished")
}
输出结果:
0
1
2
3
4
Finished

Process finished with exit code 0

注意:
  1. channel不像文件一样需要经常去关闭,只有当你确实没有任何发送数据了,或者你想显式的结束range循环之类的,才去关闭channel;
  2. 关闭channel后,无法向channel 再发送数据(引发 panic 错误后导致接收立即返回零值);
  3. 关闭channel后,可以继续从channel接收数据;
  4. 对于nil channel,无论收发都会被阻塞。
可以使用 range 来迭代不断操作channel:

package main

import (
   "fmt"
)

func main() {
   c := make(chan int)

   go func() {
      for i := 0; i < 5; i++ {
         c <- i
         }
      //把 close(c) 注释掉,程序会一直阻塞在 if data, ok := <-c; ok 那一行
      close(c)
      }()

   for data := range c {
      fmt.Println(data)
      }
   fmt.Println("Finished")
}
输出结果:
0
1
2
3
4
Finished

Process finished with exit code 0


4.读写锁与互斥锁


为了解决协程同步的问题我们使用了channel,但是Go语言中也提供了传统的同步工具。

它们都在GO的标准库代码包sync和sync/atomic中。

 5/7   首页 上一页 3 4 5 6 7 下一页 尾页

  • 微信扫一扫~
  • 支付宝扫一扫~

很赞哦! ()

上一篇:面向对象

下一篇:Golang之网络编程

相关文章

文章评论

本站推荐