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 数据结构,来记录与 ...
随机推荐
- am335x system upgrade set/get current cpufreq(二十一)
1 Scope of Document This document describes am335x cpufreq technology insider. 2 Requireme ...
- EasyEarth三维可视化解决方案——智慧河长
EasyEarth—— 为河长装上“千里眼.顺风耳” 为各级河长办应急指挥.任务指派. 实绩考核提供快速直观的 高效.精准.智能化决策平台. 河长制背景 我国治水工作呈现出新老问题交织态势,河湖管理保 ...
- mysql 提示ssl问题
问题信息如下: rements SSL connection must be established by default if explicit option isn't set. For comp ...
- 使用深度学习的超分辨率介绍 An Introduction to Super Resolution using Deep Learning
使用深度学习的超分辨率介绍 关于使用深度学习进行超分辨率的各种组件,损失函数和度量的详细讨论. 介绍 超分辨率是从给定的低分辨率(LR)图像恢复高分辨率(HR)图像的过程.由于较小的空间分辨率(即尺寸 ...
- 学习opencv(1)
目录 CV_8UC3 Scalar--颜色赋值 using namespace cv找不到命名空间 waitKey() getTickCount() 引用 CV_8UC3 a) 存放单通道图像中像素: ...
- 如何在IDEA上配置Maven
IDEA 全称 IntelliJ IDEA,是java语言开发的集成环境,IntelliJ在业界被公认为最好的Java开发工具之一, IDEA是JetBrains公司的产品,现在有逐步取代老牌Java ...
- SSM项目实战 之 Maven
目录 Maven 简介 Maven是什么 Maven下载安装 Maven使用 Maven规定了一套默认的项目格式 创建第一个Maven项目 Maven仓库 Maven常用命令 Maven作用范围(sc ...
- idea在使用git clone 时出现Filename too long
idea在使用git clone 时出现Filename too long的报错信息,使用如下命令就可以解决该问题:在 git bash命令模式下,运行命令 git config --global c ...
- android: android 布局中的weight 属性
android: weight是线性布局的特有属性,控件的宽度和高度的不同,也会存在差异. 示例1:将宽度设置为包裹类型wrap_content或0dp <?xml version=" ...
- vue---定义全局变量或函数
开发项目的时候,有很多的东西需要重复使用,例如函数或者变量等,例如网站服务器地址,token等,这时候就需要设置一波全局变量和全局函数 定义全局函数 原理 新建一个模块文件,然后在main.js里面通 ...