go学习 --- go协程
一、go协程与go主线程
Go主线程:一个Go线程上,可以起多个协程,协程是轻量级的线程。
二、go协程特点
1、有独立的栈空间
2、共享程序堆空间
3、调度由用户控制
4、协程是轻量级的线程
三、入门练习
package mainimport ("fmt""time"
)func test() {for i := 0;i <10 ;i++ {fmt.Println("协程:hello world",i)time.Sleep(time.Second)}
}
func main() {//开启协程go test()for i := 0;i <10 ;i++ {fmt.Println("主线程程:hello world",i)time.Sleep(time.Second)}
}
四、go协程流程图
五、MPG模式
1、M:操作系统的主线程(是物理线程)
2、P:协程执行需要的上下文
3、G:协程
六、设置cpu数
package mainimport ("fmt""runtime"
)func main() {//查看本机cpu个数cpu := runtime.NumCPU()fmt.Println(cpu)//设置要使用的cpu个数runtime.GOMAXPROCS(cpu-1)
}
七、资源竞争问题
使用全局变量加锁来解决
package mainimport ("fmt""sync""time"
)var Map = make(map[int]int,10)
//声明全局互斥锁
var look = sync.Mutex{}
//计算阶乘
func test1(n int) {num := 1for i:=1;i <= n ;i++ {num *= i}//加锁look.Lock()Map[n] = num//解锁look.Unlock()
}
func main() {//开启协程for i:=1;i <= 20 ;i++ {go test1(i)}//休眠time.Sleep(time.Second * 10)look.Lock()for key, value := range Map {fmt.Println(key,value)}look.Unlock()
}
go学习 --- go协程相关推荐
- Lua学习——Coroutine协程
在菜鸟教程学习lua时,在coroutine这一章看到这么一段 coroutine.running就可以看出来,coroutine在底层实现就是一个线程. 当create一个coroutine的时候就 ...
- Python 学习笔记 - 协程
Python里面控制并发,除了多线程和多进程,还可以使用协程(CoRoutine).他是在一个线程内通过程序员人为的指定来进行切换 例1:通过switch()可以人为来回切换到另外一个函数:当所有函数 ...
- python学习之-- 协程
协程(coroutine) 也叫:微线程,是一种用户态的轻量级线程,就是在单线程下实现并发的效果. 优点: 1:无需线程上下文切换的开销.(就是函数之间来回切换) 2:无需原子操作锁定及同步的开销.( ...
- python协程学习——写个并发获取网站标题的工具
平时做渗透的时候,有时候给的是一些域名.一些 url .一些 ip 或者三者都有,手动去一个个地打开比较浪费时间.我们需要用最短时间发现一些有趣的目标,如 xx 管理后台.于是让我们用 pytho ...
- 超牛逼的异步协程爬虫
写在前面: 本来这篇文章只是用来记录一下学习异步协程爬虫的笔记,感谢CSDN的大力支持,引来了很多关注和浏览,也有很多大佬的批评指针. 事先声明:本文只是学习使用,在爬虫的实战应用中还要添加诸多限制, ...
- 阿里开源 iOS 协程开发框架 coobjc源码分析
背景 昨天朋友圈被一篇文章(以下简称"coobjc介绍文章")刷屏了:刚刚,阿里开源 iOS 协程开发框架 coobjc!.可能大部分iOS开发者都直接懵逼了: 什么是协程? 协程 ...
- 一文看透 Kotlin 协程本质
前言 公司开启新项目了,想着准备亮一手 Kotlin 协程应用到项目中去,之前有对 Kotlin 协程的知识进行一定量的学习,以为自己理解协程了,结果--实在拿不出手! 为了更好的加深记忆和理解,更全 ...
- 枯燥的Kotlin协程三部曲(上)——概念启蒙篇
0x0.引言 Kotlin 1.3 版本开始引入协程 Coroutine,简练的官方文档和网上一堆浅尝辄止的文章让我心里有些没底,不想止步于仅仅知道: ① Android中,Kotlin协程用于解决: ...
- C++ 开源协程库 libco——原理及应用
1 导论 使用 C++ 来编写高性能的网络服务器程序,从来都不是件很容易的事情.在没有应用任何网络框架,从 epoll/kqueue 直接码起的时候尤其如此.即便使用 libevent, libev这 ...
最新文章
- Redis热点Key发现及常见解决方案
- python培训出来的有公司要吗-参加Python培训后真的能找到工作吗?上海Python培训...
- python自学步骤-Python入门深度学习完整指南
- 解决IDEA2020.1版本不兼容Lombok的问题
- c++ 编译添加dll_matconvnet安装、编译、配置
- php var_export与var_dump 输出的不同
- WebStorm按Tab建快速生成代码模块
- 飞秋的不定长度字符串处理方法
- 2016/05/13 thinkphp 3.2.2 ① 数据删除及执行原生sql语句 ②表单验证
- js关于两个字符串的加减乘除运算
- java基础知识精讲视频教程百度云盘分享!
- 吴恩达 深度学习 2021版 作业
- html爱心表白代码(最全)
- Override and Overload
- 世界33种名车标志及来历
- WPS文字目录怎么做?目录制作的三种方法
- 显存(Video Memory)
- 用python实现二分法求平方根_二分法求平方根(Python实现)
- 腾讯云服务器linux系统有图形界面,腾讯云CentOS7搭建图形化界面并远程连接
- 不同vlan间的通信--三层交换技术