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稳定之后的事情了,根据历史经验,新特性的引入到稳定被广泛采用至少要一个大版本的跨 ...
随机推荐
- 11.2.0.1单实例DGduplicate过程
记录一次duplicate完整过程1)环境说明数据库版本oracle11.2.0.1,os linux 6.6备库应用的归档,最近一次是三个月前,由于DG环境以前是好的,因此直接迁移数据即可.本次使用 ...
- 测试那些事儿—selenium IDE 自动化测试
浏览器 Firefox Setup 35.0.1 安装完成后设置菜单栏 关闭浏览器自动更新 插件配置(必备武器) FireBug Firebug是firefox下的一个扩展,能够调试所有网站语言,如H ...
- xcode打包真机测试
背景:xocode版本低于真机版本 解决方法:
- 2018.5.11 B树总结
小结 B树:二叉树,每个结点只存储一个关键字,等于则命中,小于走左结点,大于 走右结点: B-树:多路搜索树,每个结点存储M/2到M个关键字,非叶子结点存储指向关键 字范围的子结点: 所有关键字在整颗 ...
- 1130-Host '192.168.0.105' is not allowed to connect to this MySQL server的解决方案
在CentOS 7服务器(192.168.0.118)上安装mysql5.7.17后,在本地(192.168.0.105)通过Navicat连接服务器上的MySQL报错,报错如图所示: Paste_I ...
- Java成神路上之设计模式系列教程之一
Java成神路上之设计模式系列教程之一 千锋-Feri 在Java工程师的日常中,是否遇到过如下问题: Java 中什么叫单例设计模式?请用Java 写出线程安全的单例模式? 什么是设计模式?你是否在 ...
- MySQL下载与安装
百度云网盘: https://pan.baidu.com/s/11ZIuXcNowp4_bVH4FLhyYA 提取码:ocuh MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发, ...
- C语言入门(1)
开始学习C语言 第一个C语言程序 #include<stdio.h> int main() { printf("Hello World!"); } C程序结构 1. 头 ...
- [Ynoi2019模拟赛]Yuno loves sqrt technology III
题目大意: 给你一个长为n的序列a,m次询问,每次查询一个区间的众数的出现次数,强制在线. 解题思路: 出题人题解 众所周知lxl是个毒瘤,Ynoi道道都是神仙题 首先得离散化. 分块后,预处理Fi, ...
- C51单片机_day_01(定时器和中断系统)
c51单片机 51单片机是控制电路系统的开关,当然芯片就是51芯片,现在随着科技的发展,也是出了很多,功能更多,更全的芯片. 51是用c语言做为程序编程的语言 ——我对基本基础 ...