Go语言 并发编程
Go语言 并发编程
作者:Eric 微信:loveoracle11g
1、创建goroutine
// 并行 是两个队列同时使用两台咖啡机
// 并发 是两个队列交替使用一台咖啡机
package main
import (
"fmt"
"time"
)
func newTask() {
for {
fmt.Println("this is a newTask")
time.Sleep(time.Second) // 延时1s
}
}
func main() {
go newTask() // 新建一个协程,新建一个任务
for {
fmt.Println("this is a main goroutine")
time.Sleep(time.Second) // 延时1s
}
}
2、主goroutine先退出
package main
import (
"fmt"
"time"
)
// 主协程退出了,其它子协程也要跟着退出
func main() {
go func() {
i := 0
for {
i++
fmt.Println("子协程 i =", i)
time.Sleep(time.Second)
}
}()
i := 0
for {
i++
fmt.Println("main i =", i)
time.Sleep(time.Second)
if i == 2 {
break
}
}
}
3、主协程先退出导致子协程没有来得及调用
package main
import (
"fmt"
"time"
)
func main() {
go func() {
i := 0
for {
i++
fmt.Println("子协程 i =", i)
time.Sleep(time.Second)
}
}()
}
4、Gosched的使用
package main
import "fmt"
func main() {
go func() {
for i := 0; i < 5; i++ {
fmt.Println("Go")
}
}()
for i := 0; i < 2; i++ {
fmt.Println("hello")
}
}
package main
import (
"fmt"
"runtime"
)
func main() {
go func() {
for i := 0; i < 5; i++ {
fmt.Println("Go")
}
}()
for i := 0; i < 2; i++ {
// 让出时间片,先让别的协议执行,它执行完毕,再来执行此协程
runtime.Gosched()
fmt.Println("hello")
}
}
5、Goexit的使用
package main
import (
"fmt"
"runtime"
)
func test() {
defer fmt.Println("ccccccccccccccccccccccc")
// return // 终止此函数
runtime.Goexit() // 终止所在的协程
fmt.Println("ddddddddddddddddddddddddddddd")
}
func main() {
// 创建新建的协程
go func() {
fmt.Println("aaaaaaaaaaaaaaaaaaaaaaaaa")
// 调用了别的函数
test()
fmt.Println("bbbbbbbbbbbbbbbbbbbbbbbbb")
}()
// 特地写一个死循环,目的不让主协程结束
for {
}
}
6、GOMAXPROCS的使用
package main
import (
"fmt"
"runtime"
)
func main() {
// n := runtime.GOMAXPROCS(1) // 指定以1核运算
n := runtime.GOMAXPROCS(4) // 指定以4核运算
fmt.Println("n =", n)
for {
go fmt.Print(1)
fmt.Print(0)
}
}
7、多任务资源竞争问题
package main
import (
"fmt"
"time"
)
// 定义一个打印机,参数为字符串,按每个字符打印
// 打印机属于公共资源
func printer(str string) {
for _, data := range str {
fmt.Printf("%c", data)
time.Sleep(time.Second)
}
fmt.Printf("\n")
}
func person1() {
printer("hello")
}
func person2() {
printer("world")
}
func main() {
// printer("hello")
// printer("world")
// 新建2个协程,代表2个人,2个人同时使用打印机
go person1()
go person2()
// 特地不让主协程结束,死循环
for {
}
}
8、通过channel实现同步
package main
import (
"fmt"
"time"
)
// 全局变量,创建一个channel
var ch = make(chan int)
// 定义一个打印机,参数为字符串,按每个字符打印
// 打印机属于公共资源
func printer(str string) {
for _, data := range str {
fmt.Printf("%c", data)
time.Sleep(time.Second)
}
fmt.Printf("\n")
}
// person1执行完后,才能到person2执行
func person1() {
printer("hello")
ch <- 666 //给管道写数据,发送
}
func person2() {
<-ch // 从管道取数据,接收,如果通道没有数据,他就会阻塞
printer("world")
}
func main() {
// printer("hello")
// printer("world")
// 新建2个协程,代表2个人,2个人同时使用打印机
go person1()
go person2()
// 特地不让主协程结束,死循环
for {
}
}
9、通过channel实现同步和数据交互
package main
import (
"fmt"
"time"
)
func main() {
// 创建channel
ch := make(chan string)
defer fmt.Println("主协程也结束了")
go func() {
defer fmt.Println("子协程调用完毕")
for i := 0; i < 2; i++ {
fmt.Println("子协程 i =", i)
time.Sleep(time.Second)
}
ch <- "我是子协程,工作完毕"
}()
str := <-ch // 没有数据前,阻塞
fmt.Println("str =", str)
}
10、无缓冲channel
package main
import (
"fmt"
"time"
)
func main() {
// 创建channel
ch := make(chan int, 0)
// len(ch) 缓存区剩余数据个数
// cap(ch) 缓冲区大小
fmt.Printf("len(ch) = %d, cap(ch) = %d\n", len(ch), cap(ch))
// 新建协程
go func() {
for i := 0; i < 3; i++ {
fmt.Println("子协程:i =", i)
ch <- i // 往chan写内容
}
}()
// 延时
time.Sleep(2 * time.Second)
for i := 0; i < 3; i++ {
num := <-ch // 读管道中的内容,没有内容前,阻塞
fmt.Println("num =", num)
}
}
11、
Go语言 并发编程的更多相关文章
- 融云开发漫谈:你是否了解Go语言并发编程的第一要义?
2007年诞生的Go语言,凭借其近C的执行性能和近解析型语言的开发效率,以及近乎完美的编译速度,席卷全球.Go语言相关书籍也如雨后春笋般涌现,前不久,一本名为<Go语言并发之道>的书籍被翻 ...
- Go语言并发编程总结
转自:http://blog.csdn.net/yue7603835/article/details/44309409 Golang :不要通过共享内存来通信,而应该通过通信来共享内存.这句风靡在Go ...
- go语言并发编程
引言 说到go语言最厉害的是什么就不得不提到并发,并发是什么?,与并发相关的并行又是什么? 并发:同一时间段内执行多个任务 并行:同一时刻执行多个任务 进程.线程与协程 进程: 进程是具有一定独立功能 ...
- Go语言并发编程示例 分享(含有源代码)
GO语言并发示例分享: ppt http://files.cnblogs.com/files/yuhan-TB/GO%E8%AF%AD%E8%A8%80.pptx 代码, 实际就是<<Go ...
- Python3 与 C# 并发编程之~ 线程篇
2.线程篇¶ 在线预览:https://github.lesschina.com/python/base/concurrency/3.并发编程-线程篇.html 示例代码:https://gith ...
- 11 go并发编程-上
其他编程语言并发编程的效果 并发编程可以让开发者实现并行的算法以及编写充分利用多核处理器和多核性能的程序.在当前大部分主流的编程语言里,如C,C++,java等,编写维护和调试并发程序相比单线程程序而 ...
- golang:并发编程总结
并行和并发 并发编程是指在一台处理器上"同时"处理多个任务. 宏观并发:在一段时间内,有多个程序在同时运行. 微观并发:在同一时刻只能有一条指令执行,但多个程序指令被快速的轮换执行 ...
- 《Go并发编程实战》读书笔记-初识Go语言
<Go并发编程实战>读书笔记-初识Go语言 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在讲解怎样用Go语言之前,我们先介绍Go语言的特性,基础概念和标准命令. 一. ...
- c++ 11开始语言本身和标准库支持并发编程
c++ 11开始语言本身和标准库支持并发编程,意味着真正要到编译器从语言和标准库层面开始稳定,估计得到17标准出来.14稳定之后的事情了,根据历史经验,新特性的引入到稳定被广泛采用至少要一个大版本的跨 ...
随机推荐
- 使用jquey 须掌握的常见知识点
1.jquery获取标签.class.id.input的值 $("div") $(".active") $("#login") ...
- SpringBoot的学习【6.YML 和 Properties 的语法】
1.YML的基本语法 KEY:(空格)value:(空格) 以空格的缩进来表示同一层级.属性和值是大小写敏感的. 2.YML和属性.属性值进行匹配 注解:@ConfigurationPropertie ...
- 神州数码HSRP(热备份路由协议)配置
实验要求:掌握HSRP配置方法 拓扑如下 R1 enable 进入特权模式 config 进入全局模式 hostname R1 修改名称 interface g0/6 进入端口 ip address ...
- iOS开发之UIGestureRecognizer
一:首先查看一下关于UIGestureRecognizer的定义 //当前手势状态 typedef NS_ENUM(NSInteger, UIGestureRecognizerState) { //尚 ...
- Linux命令基础2-ls命令
本文介绍的是linux中的ls命令,ls的单词是list files的缩写,意思的列出目录文件. 首先我们在admin用户的当前路径,新建一个test的文件夹,为了方便本文操作和介绍,创建了不同文件类 ...
- 商品规格,自定义SKU类型
<html> <head> <script type="text/javascript" src="http://xoxco.com/exa ...
- 根据某字段将其他字段进行拼接的两种方法(SYS_CONNECT_BY_PATH及wm_concat)
秘书姐姐说想知道她发起的所有流程,现在都到谁审批了.由于一条流程当前审批人可能有多个,故需根据单据编号(djbh)将审批人拼接到一个字段中. 说明: wfn审批历史记录表,djbh 单据编号,pk_c ...
- [C++]_ELVE_Windows下QT5.12连接MySql8.0解决方案
#0x01 准备 1)要保证QT和MySQL都是一样的位数,我的就是都安装的64位. 2)安装Qt5.12,这里主要提一点,在安装时候,有个选择插件那块,尽量都选上,里面有个database选项,记得 ...
- .Net牛刀小试-1缓冲使用
根据文件名缓冲文件: /// <summary> /// 根据文件名缓冲指定目录文件 /// </summary> public class FileCacheAdapter ...
- NFPA, UL
Who or what is NFPA? NFPA (National Fire Protection Association) is an organization in the USA that ...