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稳定之后的事情了,根据历史经验,新特性的引入到稳定被广泛采用至少要一个大版本的跨 ...
随机推荐
- 关于下拉列表HtmlDownlistFor的使用
1.定义下拉列表需要的数据 public static List<SelectListItem> GetProList() { List<SelectListItem> i ...
- videojs播放直播源rtmp时画面在左上角解决方案
问题描述:https://stackoverflow.com/questions/30383135/videojs-live-rtmp-stream-player-and-video-size-iss ...
- 1px和backgroudImage
https://blog.csdn.net/leadn/article/details/78560786 .setTopLine(@c: #C7C7C7) { & { position: re ...
- 20164322 韩玉婷-----Exp6 信息搜索与漏洞扫描
1.实践目标 掌握信息搜集的最基础技能与常用工具的使用方法. 2.实践内容 (1)各种搜索技巧的应用 (2)DNS IP注册信息的查询 (3)基本的扫描技术:主机发现.端口扫描.OS及服务版本探测.具 ...
- 用雷达统计成绩单、numpy、matplotlib的使用
#e19.1DrawRadar import numpy as np import matplotlib.pyplot as plt import matplotlib matplotlib.rcPa ...
- 《DSP using MATLAB》Problem 7.27
代码: %% ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ %% Output In ...
- tensorboard No graph definition files were found No scalar data was found 解决方法
logdir后面的路径不要加引号!!!! tensorboard --logdir='D:\WorkSpace\eclipse\tf_tr\train\my_graph\' 删除引号,改为: tens ...
- 用js简单实现一下迪克斯特拉算法
今天看书看到了迪克斯特拉算法,大概用js实现一下呢,计算最短路径. 首先,迪克斯特拉算法只适用于有向无环图,且没有负权重,本例关系图如下哦,数字为权重,emmmm,画得稍微有点丑~ //大概用js实现 ...
- ST&倍增LCA
回顾st算法,它的一大功能是求区间最值.先将整个区间划分成若干个小的区间,求出最值,然后将小的区间合并成一个大的区间,我们这里要用到一个数组minn[i][j],划重点!如果我们要求的是区间最小值,m ...
- MySQL 读写分离(转载)
原文地址:https://blog.csdn.net/justdb/article/details/17331569