您现在的位置是:首页 > 学习笔记 > 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读写锁



有人把Go比作21世纪的C语言。第一是因为Go语言设计简单,第二,21世纪最重要的就是并行程序设计,而Go从语言层面就支持并行。同时,并发程序的内存管理有时候是非常复杂的,而Go语言提供了自动垃圾回收机制。

Go语言为并发编程而内置的上层API基于顺序通信进程模型CSP(communicating sequential processes)。这就意味着显式锁都是可以避免的,因为Go通过相对安全的通道发送和接受数据以实现同步,这大大地简化了并发程序的编写。Go语言中的并发程序主要使用两种手段来实现,即goroutine和channel。
 

2.Goroutine

 

2.1Goroutine定义


goroutine是Go语言并行设计的核心,有人称之为go程。 goroutine说到底其实就是协程,它比线程更小,十几个goroutine可能体现在底层就是五六个线程,Go语言内部帮你实现了这些goroutine之间的内存共享。执行goroutine只需极少的栈内存(大概是4~5KB),当然会根据相应的数据伸缩。也正因为如此,可同时运行成千上万个并发任务。goroutine比thread更易用、更高效、更轻便。

一般情况下,一个普通计算机跑几十个线程就有点负载过大了,但是同样的机器却可以轻松地让成百上千个goroutine进行资源竞争。
 

2.2Goroutine的创建


只需在函数调⽤语句前添加 go 关键字,就可创建并发执⾏单元。开发⼈员无需了解任何执⾏细节,调度器会自动将其安排到合适的系统线程上执行。

在并发编程中,我们通常想将一个过程切分成几块,然后让每个goroutine各自负责一块工作,当一个程序启动时,主函数在一个单独的goroutine中运行,我们叫它main goroutine。新的goroutine会用go语句来创建。而go语言的并发设计,让我们很轻松就可以达成这一目的。

示例:
package main

import (
   "fmt"
)

func task()  {
   i:=0
   for{
      i++
      fmt.Printf("new子go程正在打印,i=%d\n",i)
      
   }
}
func main()  {

go task()

   i:=0

   for{
      i++
      fmt.Printf("===========new主go程正在打印,i=%d\n",i)
      
   }
}

输出结果:
===========new主go程正在打印,i=1
new子go程正在打印,i=1
new子go程正在打印,i=2
===========new主go程正在打印,i=2
new子go程正在打印,i=3
===========new主go程正在打印,i=3
===========new主go程正在打印,i=4
new子go程正在打印,i=4
new子go程正在打印,i=5
===========new主go程正在打印,i=5
===========new主go程正在打印,i=6
new子go程正在打印,i=6
new子go程正在打印,i=7
===========new主go程正在打印,i=7
===========new主go程正在打印,i=8
new子go程正在打印,i=8
new子go程正在打印,i=9
===========new主go程正在打印,i=9
===========new主go程正在打印,i=10
new子go程正在打印,i=10
new子go程正在打印,i=11
===========new主go程正在打印,i=11
...


2.3Goroutine特性


主goroutine退出后,其它的工作goroutine也会自动退出。

示例:

package main

import (
   "fmt"
)

func task()  {
   i:=0
   for{
      i++
      fmt.Printf("new子go程正在打印,i=%d\n",i)
   }
}

func main()  {

go task()
      fmt.Print("===========new主go程正在打印")

}

输出结果:
new子go程正在打印,i=1
new子go程正在打印,i=2
===========new主go程正在打印

Process finished with exit code 0
 

3.channel管道

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

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

很赞哦! ()

上一篇:面向对象

下一篇:Golang之网络编程

相关文章

文章评论

本站推荐