golang核心Goroutine和channel
一、Goroutine
1、介绍
goroutine简介 goroutine是go语言中最为NB的设计,也是其魅力所在,goroutine的本质是协程,是实现并行计算的核心。goroutine使用方式非常的简单,只需使用go关键字即可启动一个协程,并且它是处于异步方式运行,你不需要等它运行完成以后在执行以后的代码。
1、 主线程是一个物理线程,直接作用在 cpu 上的。是重量级的,非常耗费 cpu 资源。
2、 协程从主线程开启的,是轻量级的线程,是逻辑态。对资源消耗相对小。
3、 Golang 的协程机制是重要的特点,可以轻松的开启上万个协程。其它编程语言的并发机制是一般基于线程的,开启过多的线程,资源耗费大,这里就突显 Golang 在并发上的优
4、goroutine通过go关键字实现了,其实就是一个普通的函数。
为了充分了利用多 cpu 的优势,在 Golang 程序中,设置运行的 cpu 数目(Go1.8以后默认运行在多核上)
num := runtime.NumCPU() //本地机器的逻辑CPU个数
runtime.GOMAXPROCS(num) //设置可同时执行的最大CPU数,并返回先前的设置
fmt.Println(num)
2、执行流程图

3、简单例子
package main
import (
"fmt"
"time"
) func test(){
for i := 1;i <= 10;i++ {
fmt.Println(i)
time.Sleep(time.Second * 2 ) //睡眠2s
} } func main(){
go test() //开启协程
for i := 1;i <= 10;i++ {
fmt.Println("===============")
time.Sleep(time.Second ) //睡眠1s }
} #########结果######
===============
1
===============
===============
2
===============
3
===============
===============
4
===============
===============
5
===============
===============
6
4、使用全局变量加锁的例子
计算0-10的乘阶
代码:
package main import (
"fmt"
"sync"
"time"
) var (
m = make(map[int]uint64)
//lock是一个全局互斥锁
//sync.Mutex 是互斥锁
lock sync.Mutex //申明一个互斥锁
) type task struct {
n int
} func calc(t *task) {
defer func() {
err := recover()
if err != nil {
fmt.Println("error...")
return
}
}() var sum uint64
sum = 1
for i := 1; i < t.n; i++ {
sum *= uint64(i)
} lock.Lock() //加锁
m[t.n] = sum
lock.Unlock() //解锁
} func main() {
for i := 0; i <= 10; i++ {
t := &task{n: i}
go calc(t) // Goroutine来执行任务
} time.Sleep(time.Second) // Goroutine异步,所以等一秒到任务完成 lock.Lock() //读全局数据加锁
for k, v := range m {
fmt.Printf("%d! = %v\n", k, v)
}
fmt.Println(len(m))
lock.Unlock() //解锁
} #########结果#######
10! = 362880
0! = 1
2! = 1
3! = 2
4! = 6
5! = 24
7! = 720
8! = 5040
1! = 1
6! = 120
9! = 40320
11
二、channel
channel 的基本介绍
1、channle 本质就是一个数据结构-队列
2、数据是先进先出
3、线程安全,多 goroutine 访问时,不需要加锁,就是说 channel 本身就是线程安全的
4、channel 有类型的,一个 string 的 channel 只能存放 string 类型数
示意图:

文档参考:
http://www.cnblogs.com/wdliu/p/9272220.html
channel 使用的注意事项
1、channel 中只能存放指定的数据类型
2、channle 的数据放满后,就不能再放入了
3、如果从 channel 取出数据后,可以继续放入
4、在没有使用协程的情况下,如果 channel 数据取完了,再取,就会报 dead lock
golang核心Goroutine和channel的更多相关文章
- golang的goroutine与channel
Golang的goroutine是非抢占式的, 令人相当蛋疼! 有痛不能呻吟...只能配合channel在各goroutine之间传递信号来实现抢占式, 而这形成了golang最灵活与最具性能的核心. ...
- goroutine和channel
近期在学习golang的goroutine和channel时候有一些疑惑: 带缓冲的channel和不带缓冲的channel有什么区别? goroutine和主进程的有哪些影响和关系? 多个gorou ...
- Golang的goroutine协程和channel通道
一:简介 因为并发程序要考虑很多的细节,以保证对共享变量的正确访问,使得并发编程在很多情况下变得很复杂.但是Go语言在开发并发时,是比较简洁的.它通过channel来传递数据.数据竞争这个问题在gol ...
- Golang核心编程
源码地址: https://github.com/mikeygithub/GoCode 第1章 1Golang 的学习方向 Go 语言,我们可以简单的写成 Golang 1.2Golang 的应用领域 ...
- golang协程——通道channel阻塞
新的一年开始了,不管今天以前发生了什么,向前看,就够了. 说到channel,就一定要说一说线程了.任何实际项目,无论大小,并发是必然存在的.并发的存在,就涉及到线程通信.在当下的开发语言中,线程通讯 ...
- Go开发[八]goroutine和channel
进程和线程 进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位. 一个进程可以创 ...
- Go--关于 goroutine、channel
Go--关于 goroutine.channel goroutine 协程是一种轻量化的线程,由Go编译器进行优化. Go协程具有以下特点: 有独立的栈空间 共享程序堆中的空间 调度由用户控制 如果主 ...
- go并发之goroutine和channel,并发控制入门篇
并发的概念及其重要性 这段是简单科普,大佬可以跳过 并发:并发程序指同时进行多个任务的程序.在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行 ...
- TODO:Go语言goroutine和channel使用
TODO:Go语言goroutine和channel使用 goroutine是Go语言中的轻量级线程实现,由Go语言运行时(runtime)管理.使用的时候在函数前面加"go"这个 ...
随机推荐
- 从零开始搭建一个规范的vue-cli 3.0项目
在这一集我们将讲到如何从安装vue-cli开始,到新建一个本地项目,再到vscode中关于eslint的配置,以及本地项目关联公司远程项目的基本操作. 一,初始化本地项目 1,首先,全局安装vue-c ...
- Win32对话框程序(1)
之前学C语言是一直都是在控制台下面操作的,面对的都是黑框框,严重的打击了学习的兴趣.后来在TC下进行C语言课程设计,做了图形界面编程,但都是点线面画的…… 中间隔了好长一段时间没有碰过C语言,最近才开 ...
- Bootstrap 前端框架 遇到的问题 解决方案
bootstrap实现导航栏的响应式布局,当在小屏幕.手机屏幕浏览时自动折叠隐藏 直接放代码,更容易理解.下次可以套这个代码 <!DOCTYPE html> <html> &l ...
- vue-cli3安装过程
作为一个本来是java开发的搬运工,在公司前端人员缺乏的时候,就直接顶上来开发前台页面了(话说我已经很久很久没写java代码了(:′⌒`)) 好吧言归正传,刚开始弄前台就是vue,vue2还没弄熟,老 ...
- SpringBoot实用小知识之Maven中dependencys和dependencymanagement区别
利用pom管理引用包时,如果是单项目的话就直接在dependencies引用了,若有一个大工程项目里面包含多个子模块,则为了所有项目模块包的版本统一和好管理,则需要用到dependencyManage ...
- Eureka服务下线后快速感知配置
现在由于eureka服务越来越多,发现服务提供者在停掉很久之后,服务调用者很长时间并没有感知到变化,依旧还在持续调用下线的服务,导致长时间后才能返回错误,因此需要调整eureka服务和客户端的配置,以 ...
- vue项目首屏加载优化实战
问题 单页面应用的一个问题就是首页加载东西过多,加载时间过长.特别在移动端,单页面应用的首屏加载优化更是绕不开的话题.下面我会写出我在项目中做的一些优化,希望大家能够相互讨论,共同进步. 我的项目vu ...
- 4.5管道实现机制和模拟构建管道「深入浅出ASP.NET Core系列」
希望给你3-5分钟的碎片化学习,可能是坐地铁.等公交,积少成多,水滴石穿,谢谢关注. 管道实现机制 要了解管道的实现机制,我们必须要深入框架的源码,幸亏微软开源了,我们可以访问GitHub的地址来下载 ...
- [C#学习笔记1]用csc.exe和记事本写一个C#应用程序
csc.exe是C#的命令行编译器(CSharpCompiler),可以编译C#源程序成可执行程序.它与Visual Studio等IDE(Integrated Development Environ ...
- 【AO笔记】关于创建IFeatureClass中的参考系设置——不能为null也不能为IUnknownCoodinateSystem
创建一个要素类是很简单的,只需要获取一枚IFeatureWorkspace或者一个IFeatureDataset,然后调用其CreateFeatureClass()即可. 这个CreateFeatur ...