Go 协程
Go 协程
协程与传统的系统级线程和进程相比,协程的优势在于其"轻量级",可以轻松创建上百万个协程而不会导致系统资源衰竭,所以协程也叫做轻量级线程。
在Go中goroutine就是协程的意思,不同的是,Go在runtime、系统调用等多方面对goroutine调度进行了封装和处理,当遇到长时间执行或者进行系统调用时,会主动把当前goroutine的CPU转让出去,让其他goroutine能被调度并执行。
在Go中应用协程
在Go中应用协程,只需要在一个函数调用前加入go关键字,就可以实现协程,如:
package main
import "fmt"
func Add(x,y int){
z := x + y
fmt.Println(z)
}
func main(){
for i:=0;i<10;i++{
go Add(i, i)
}
}
运行程序会发现没有任何输出,因为程序运行主函数很快就退出了,没有机会去执行Add函数中输出语句,所以我们在主函数中加一点延时
package main
import (
"fmt"
"time"
)
func Add(x,y int){
z := x + y
fmt.Println(z)
}
func main(){
for i:=0;i<10;i++{
go Add(i, i)
}
time.Sleep(time.Second)
}
这里我们就可以看到输出了
4
0
12
6
8
10
16
14
18
2
协程同步
下面的例子使用锁来实现协程同步,但是Go提供了更好的方式实现协程同步。
没有加锁的案例:
func Show(str string){
for _, i := range str{
fmt.Printf("%c", i)
time.Sleep(time.Second)
}
}
func main(){
go Show("hello")
go Show("world")
// 死循环不让主函数退出,和Sleep效果一致
for {
fmt.Print()
}
}
输出结果:
hwoelrlldo
这并不是我们想要的效果,所以加上锁,案例:
func Show(str string, lock *sync.Mutex){
lock.Lock()
for _, i := range str{
fmt.Printf("%c", i)
time.Sleep(time.Second)
}
lock.Unlock()
}
func main(){
lock := &sync.Mutex{}
go Show("hello", lock)
go Show("world", lock)
// 死循环不让主函数退出,和Sleep效果一致
for {
fmt.Print()
}
}
加上锁之后,输出的结果:
helloworld
这就达到了协程同步的效果。当然还有更好的方式,channel。
Go 协程的更多相关文章
- Python(八)进程、线程、协程篇
本章内容: 线程(线程锁.threading.Event.queue 队列.生产者消费者模型.自定义线程池) 进程(数据共享.进程池) 协程 线程 Threading用于提供线程相关的操作.线程是应用 ...
- Lua的协程和协程库详解
我们首先介绍一下什么是协程.然后详细介绍一下coroutine库,然后介绍一下协程的简单用法,最后介绍一下协程的复杂用法. 一.协程是什么? (1)线程 首先复习一下多线程.我们都知道线程——Thre ...
- 协程--gevent模块(单线程高并发)
先恶补一下知识点,上节回顾 上下文切换:当CPU从执行一个线程切换到执行另外一个线程的时候,它需要先存储当前线程的本地的数据,程序指针等,然后载入另一个线程的本地数据,程序指针等,最后才开始执行.这种 ...
- Python 【第五章】:线程、进程和协程
Python线程 Threading用于提供线程相关的操作,线程是应用程序中工作的最小单元. #!/usr/bin/env python # -*- coding:utf-8 -*- import t ...
- 进击的Python【第十章】:Python的socket高级应用(多进程,协程与异步)
Python的socket高级应用(多进程,协程与异步)
- unity 协程
StartCoroutine在unity3d的帮助中叫做协程,意思就是启动一个辅助的线程. 在C#中直接有Thread这个线程,但是在unity中有些元素是不能操作的.这个时候可以使用协程来完成. 使 ...
- golang 裸写一个pool池控制协程的大小
这几天深入的研究了一下golang 的协程,读了一个好文 http://mp.weixin.qq.com/s?__biz=MjM5OTcxMzE0MQ==&mid=2653369770& ...
- 从Erlang进程看协程思想
从Erlang进程看协程思想 多核慢慢火了以后,协程类编程也开始越来越火了.比较有代表性的有Go的goroutine.Erlang的Erlang进程.Scala的actor.windows下的fibr ...
- Unity学习疑问记录之协程
http://blog.csdn.net/huang9012/article/details/38492937 总结:1.协程相当于多线程但不是,(尽管它们看上去是这样的),它们运行在同一线程中,跟普 ...
- python中协程
在引出协成概念之前先说说python的进程和线程. 进程: 进程是正在执行程序实例.执行程序的过程中,内核会讲程序代码载入虚拟内存,为程序变量分配空间,建立 bookkeeping 数据结构,来记录与 ...
随机推荐
- 使用singer 转换gitbase 数据到postgresql
gitbase 是mysql server 的一个实现(主要是用来分析git仓库代码),但是里面好多功能可能并不是很强大(sql 的限制) 我们可以通过singer 的tap-mysql 将数据抽取到 ...
- 【JZOJ6218】【20190615】卖弱
题目 题解 我写的另一种方法,复杂度是\(O(Tm+nm)\)的,这是huangzhaojun写的题解... #include<cstring> #include<cstdio> ...
- 打造VIM成为IDE - nerdtree
nerdtree 自动缩进 :set paste :set nopaste set tabstop=4 set softtabstop=4 set shiftwidth=4 set noautoind ...
- Android入门教程(二)
Hello World 项目 首先当我们启动Android Studio的虚拟机时,可以看到第一个项目Hello World,那么虚拟机中的Hello World!是如何书写的呢? 看看虚拟机运行结果 ...
- 缺陷的优先程度(Priority)
测试人员希望程序员什么时间哪个版本修改该bug (1)Urgent 立即修改否则影响开发进度 (2)Veryhigh 本版本修改 (3)High 下个版本修改 (4)Medium 发布前修改 (5)L ...
- mysql的动态表名
create EVENT createMtpulseTable ON SCHEDULE every 1 month STARTS CURRENT_TIMESTAMP DO CALL pro_creat ...
- 创业小记:ALL IN才是迈出创业第一步的关键
对于创业而言,能卖出这创业第一步的,大多都经过了长期反复的心理拷问与折磨. 因为当你迈出创业的那一步,你可能需要面对的是毫无收入保障的生活,以及后果自负的结局. ALL IN才是迈出创业第一步的关键( ...
- AdaptIS: Adaptive Instance Selection Network
AdaptIS: Adaptive Instance Selection Network 2019-09-19 12:58:07 Paper: https://arxiv.org/pdf/1909.0 ...
- el-cascader遇到一个坑的问题
经仔细分析,如果二级和三级的value一样,就会出现这个问题.
- SQLServer ROW_NUMBER()函数使用方法 分区排序
#ROW_NUMBER() over()能干什么? 既可满足分区的需求,也可以根据一定的顺序来排序. #细细说 select ROW_NUMBER() over(partition by xm Ord ...