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稳定之后的事情了,根据历史经验,新特性的引入到稳定被广泛采用至少要一个大版本的跨 ...
随机推荐
- http error: "request body stream exhausted"
'request body stream exhausted' after authentication challenge #661 Closed aburgel opened this issu ...
- two pointers
two pointers是算法编程中一种非常重要的思想,但是很少会有教材单独拿出来将,其中一个原因是它更倾向于是一种编程技巧,而长得不太像是一个是“算法”的模样.two pointers的思想十分简介 ...
- Feign源码解析系列-注册套路
感谢不知名朋友的打赏,感谢你的支持! 开始 在追寻Feign源码的过程中发现了一些套路,既然是套路,就可以举一反三,所以值得关注. 这篇会详细解析Feign Client配置和初始化的方式,这些方式大 ...
- MySQL中MyISAM与InnoDB的主要区别对比
特征 MyISAM InnoDB 聚集索引 否 是 压缩数据 是(仅当使用压缩行格式时才支持压缩MyISAM表.使用压缩行格式和MyISAM的表是只读的.) 是 数据缓存 否 是 加密数据 是(通过加 ...
- word中插入myth type公式行距变大的问题
在写文章时,我遇到了在word中插入myth type公式时,行距明显变大的问题,我通过改变段落中的行距没有解决问题,在网上查了一下,找到一些解决方法,仅供参考. 解决办法
- 30天代码day1Data Types
Primitive Data Types Java has 8 primitive data types: byte, short, int, long, float, double, boolean ...
- 湖南大学第十四届ACM程序设计新生杯(重现赛)I:II play with GG(博弈论||DP)
链接:https://ac.nowcoder.com/acm/contest/338/I 来源:牛客网 题目描述 IG won the S championship and many people a ...
- 只有mdf文件和ldf文件--怎么恢复数据库
1.将mdf和ldf放到你电脑的路径中. 2.执行以下语句 USE master; GO CREATE DATABASE DBName ON (FILENAME = 'C:\Program Files ...
- Git学习之第一次使用PR
发起PR的流程 1.Fork想要pr的项目,在自己的仓库里建立一个相同的项目. 2.Clone我们Fork的项目,在本地建立一个项目,方便修改. 3.将修改后的本地项目上传到github上. 4.向原 ...
- <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>会报错
有些时候,<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>会报错,错 ...