Golang并发编程优势与核心goroutine及注意细节
Go语言为并发编程而内置的上层API基于CSP(communication sequential processes,顺序通信进程)模型。这就意味着显式锁都是可以避免的,比如资源竞争,比如多个进程同时获取文件资源需要修改,首先拿到资源的进程加上锁,等修改完之后把锁去掉,然后再给下一个进程来进行修改,只有这样才不会出现数据不一致。但是go语言不是通过锁的方式,是通过通信的方式,安全的通道发送和接收数据以实现同步,这就大大的简化了并发编程的编写。
一般情况下,一个普通的计算机跑十几二十几个线程就有点负载过大,但是同样这台机器却可以让成千甚至过万哥goroutine进行资源竞争
goroutine是什么?
goroutine是Go并行设计的核心。goroutine说到底其实就是协程,但是它比线程更小,十几个goroutine可能体现在底层就是五六个线程,Go语言内部帮你实现了这些goroutine之间的内存共享。执行goroutine只需要极少的栈内存(大概是4-5KB),当然会根据相应的数据伸缩。也正因为如此,可同时运行成千上万个并发任务。goroutine比thread更易用、更高效、更轻便。
创建goroutine
创建goroutine只需在函数调用语句前添加go关键字,就可以创建并发执行单元。开发人员无需了解任何执行细节,调度器会自动将其安排到合适的系统线程上执行。
在并发编程里,我们通常想将一个过程切分成几块,然后让每个goroutine各自负责一块工作。当一个程序启动时,其主函数即在一个单独的goroutine中运行,我们叫它main goroutine,新的goroutine会用go语句来创建,至于主和子谁先执行,由系统决定。重点:主协程退出了,其它子协程也要跟着退出;其次,主协程先退出导致子协程没来得及调用
package main import (
"fmt"
"time"
) func newTask() {
for {
fmt.Println("this is a newTask")
time.Sleep(time.Second) //延时1s
}
} func main() { //可以理解为主 goroutine go newTask() //新建一个协程, 新建一个任务 for {
fmt.Println("this is a main goroutine")
time.Sleep(time.Second) //延时1s
}
//newTask() 子协程(goroutine)如果放在这会执行不到,因为程序都是单业务。for循环是一个任务,下面执行不到 //go newTask() 但是前面加上go关键字,放到下面也没法执行
}
this is a main goroutine
this is a newTask
this is a main goroutine
this is a newTask
this is a main goroutine
this is a newTask
this is a main goroutine
this is a newTask
主协程退出了,其它子协程也要跟着退出。
package main import (
"fmt"
"time"
) //主协程退出了,其它子协程也要跟着退出
func main() { go func() {
i :=
for {
i++
fmt.Println("子协程 i = ", i)
time.Sleep(time.Second)
} }() i :=
for {
i++
fmt.Println("main i = ", i)
time.Sleep(time.Second) if i == {
break
}
} }
main i =
子协程 i =
main i =
子协程 i =
主协程先退出导致子协程没来得及调用
package main import (
"fmt"
"time"
) //主协程退出了,其它子协程也要跟着退出
func main() { go func() {
i :=
for {
i++
fmt.Println("子协程 i = ", i)
time.Sleep(time.Second)
} }() }
//执行代码并无任何输出,因为主协程先执行完退出
Golang并发编程优势与核心goroutine及注意细节的更多相关文章
- Golang - 并发编程
目录 Golang - 并发编程 1. 并行和并发 2. go语言并发优势 3. goroutine是什么 4. 创建goroutine 5. runtime包 6. channel是什么 7. ch ...
- golang并发编程
golang并发编程 引子 golang提供了goroutine快速实现并发编程,在实际环境中,如果goroutine中的代码要消耗大量资源时(CPU.内存.带宽等),我们就需要对程序限速,以防止go ...
- golang并发编程goroutine+channel(一)
go语言的设计初衷除了在不影响程序性能的情况下减少复杂度,另一个目的是在当今互联网大量运算下,如何让程序的并发性能和代码可读性达到极致.go语言的并发关键词 "go" go dos ...
- golang并发编程的两种限速方法
引子 golang提供了goroutine快速实现并发编程,在实际环境中,如果goroutine中的代码要消耗大量资源时(CPU.内存.带宽等),我们就需要对程序限速,以防止goroutine将资源耗 ...
- Golang并发编程基础
硬件 内存 作为并发编程一个基础硬件知识储备,首先要说的就是内存了,总的来说在绝大多数情况下把内存的并发增删改查模型搞清楚了其他的基本上也是异曲同工之妙. 内存芯片--即我们所知道的内存颗粒,是一堆M ...
- Golang并发编程——goroutine、channel、sync
并发与并行 并发和并行是有区别的,并发不等于并行. 并发 两个或多个事件在同一时间不同时间间隔发生.对应在Go中,就是指多个 goroutine 在单个CPU上的交替运行. 并行 两个或者多个事件在同 ...
- Golang并发编程进程通信channel了解及简单使用
概念及作用 channel是一个数据类型,用于实现同步,用于两个协程之间交换数据.goroutine奉行通过通信来共享内存,而不是共享内存来通信.引用类型channel是CSP模式的具体实现,用于多个 ...
- Golang并发编程有缓冲通道和无缓冲通道(channel)
无缓冲通道 是指在接收前没有能力保存任何值得通道.这种类型的通道要求发送goroutine和接收goroutine同时准备好,才能完成发送和接收操作.如果两个goroutine没有同时准备好,通道会导 ...
- Golang并发编程中select简单了解
select可以监听channel的数据流动select的用法与switch语法非常类似,由select开始的一个新的选择块,每个选择条件由case语句来描述 与switch语句可以选择任何使用相等比 ...
随机推荐
- 【LeetCode每天一题】Substring with Concatenation of All Words(具备列表中所有单词的字串)
You are given a string, s, and a list of words, words, that are all of the same length. Find all sta ...
- 【LeetCode每天一题】Divide Two Integers(两整数相除)
Given two integers dividend and divisor, divide two integers without using multiplication, division ...
- [LeetCode] 581. Shortest Unsorted Continuous Subarray_Easy tag: Sort, Stack
Given an integer array, you need to find one continuous subarray that if you only sort this subarray ...
- trie字典树
---恢复内容开始--- 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1251 #include <bits/stdc++.h> usin ...
- sift拟合详解
1999年由David Lowe首先发表于计算机视觉国际会议(International Conference on Computer Vision,ICCV),2004年再次经David Lowe整 ...
- 解析img图片没找到onerror事件
本篇文章主要介绍了img图片没找到onerror事件 Stack overflow at line: 0 需要的朋友可以过来参考下,希望对大家有所帮助 打开网页时提示 Stack overflow a ...
- SQLAllocHandle
函数定义: 顾名思义,该函数就是用来分配句柄的,句柄类型参考参数详解. SQLRETURN SQLAllocHandle( SQLSMALLINT HandleType, SQLHANDLE ...
- 一 js数据类型
一.简单的数据对象 ------1.小数 var fNum = 1.02; ------2.整数 var iNum = 1; ------3.逻辑变量 var bNum = true; 二.复杂的数据 ...
- 《大话设计模式》c++实现 装饰者模式
一.UML图 介绍 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创 ...
- pyinstaller将python脚本生成exe
一.下载pyinstaller 二.生成exe 下载pyinstaller 1.在C:\python27\Scripts目录下打开cmd界面,执行命令:pip install PyInstaller ...