协程概念


 协程通常称为coroutine,在golang中称为goroutine。

 协程本质上是一种用户态线程,它不需要操作系统来进行抢占式调度,在实际实现中寄存在线程之中。

 协程系统开销极小,可有效提高单个线程的任务并发性,从而避免使用多线程。而且使用协程编程简单,结构清晰。缺点就是需要编程语言的支持,如果不支持,则需要用户在程序中自行实现调度器。

goroutine


 goroutine是golang中的轻量级线程实现,由go runtime管理。

• goroutine使用语法

// 定义协程函数
func MyRoutineFunction(参数列表) (返回值列表) {
// 函数体
} // 启动协程
go MyRoutineFunction(参数列表)

 启动一个goroutine使用go关键字,go是golang中最重要的关键字,因此这个语言也是以这个关键字命名。

 在一个函数前加上go关键字调用,这次调用就会在一个新的goroutine中并发执行,开启goroutine的线程将继续执行

 当被go调用的函数返回时,这个goroutine也自动结束了。如果这个函数有返回值,那么这个返回值会被丢弃

 golang程序从main()函数开始执行,当main()函数返回时,程序结束且不等待其他goroutine结束

• goroutine使用示例

package main

import (
"fmt"
"time"
) func Add(x, y int) {
z := x + y
fmt.Println(z)
} func main() {
for i := ; i < ; i++ {
go Add(i, i)
} fmt.Println("main goroutine finished!")
time.Sleep( * time.Second)
}

程序运行两次的结果如下:

可以看出goroutine看上去的确是并发执行,结果具有不确定性。

并发与并行


• 概念

 两个队列,一个Coffee机器,那是并发。

 两个队列,两个Coffee机器,那是并行。

• golang并发与并行

▶  并发执行

 如果在单核cpu情况下,golang所有的goroutine只能在一个线程里跑 。

 如果当前goroutine不发生阻塞,它是不会让出cpu时间给其他goroutine,除非调用runtime.Gosched()主动让出时间片。

如果当前goroutine发生阻塞,它会主动让出cpu时间给其他goroutine执行。

 golang的runtime包是goroutine的调度器,其中使用runtime.GOMAXPROCS(n)可以控制使用cpu核数。

▪ 例子一

package main

import "fmt"
import
"time"
import "runtime" func loop() {
fmt.Println("loop starts!")
for i := ; i < ; i++ {
fmt.Printf("%d ", i)
}
fmt.Println()
} func main() {
runtime.GOMAXPROCS(1) // 强制使用1个cpu
go loop()
go loop() time.Sleep( * time.Second)
}

运行结果如下:

▪ 例子二

package main

import (
"fmt"
"runtime"
"time"
) func Add(x, y int) {
z := x + y
fmt.Println(z)
} func main() {
runtime.GOMAXPROCS(1) // 强制使用1个cpu
go Add(, )
go Add(, )
go Add(, )
go Add(, )
go Add(, )
go Add(, )
go Add(, )
go Add(, )
go Add(, )
go Add(, ) fmt.Println("main goroutine finished!")
time.Sleep( * time.Second)
}

运行结果如下:

▶  并行执行

 默认情况下,golang是开启多核的,因此一开始的示例中的输出就是无序的。

 我们也可以告诉golang我们允许同时最多使用核数。

▪ 例子一

package main

import "fmt"
import
"time"
import
"runtime" func loop() {
fmt.Println("loop starts!")
for i := ; i < ; i++ {
fmt.Printf("%d ", i)
}
fmt.Println()
} func main() {
runtime.GOMAXPROCS() go loop()
go loop()
go loop()
go loop() time.Sleep( * time.Second)
}

多运行几次,可以得到结果:

[golang note] 协程基础的更多相关文章

  1. [golang note] 协程通信

    channel基本语法 • channel介绍 √ golang社区口号:不要通过共享内存来通信,而应该通过通信来共享内存. √ golang提供一种基于消息机制而非共享内存的通信模型.消息机制认为每 ...

  2. Golang 之协程详解

    转自:https://www.cnblogs.com/liang1101/p/7285955.html 一.Golang 线程和协程的区别 备注:需要区分进程.线程(内核级线程).协程(用户级线程)三 ...

  3. GoLang之协程

    GoLang之协程 目前,WebServer几种主流的并发模型: 多线程,每个线程一次处理一个请求,在当前请求处理完成之前不会接收其它请求:但在高并发环境下,多线程的开销比较大: 基于回调的异步IO, ...

  4. 在C++中使用golang的协程

    开源项目cpp_features提供了一个仿golang协程的stackful协程库. 可以在c++中使用golang的协程,大概语法是这样的: #include <iostream> v ...

  5. pyhon——进程线程、与协程基础概述

    一直以来写博客都是实用主义者,只写用法,没信心写原理,但是每一次写作业的过程都有一种掘地三尺的感觉,终于,写博客困难症重症患者经历了漫长的思想斗争,还是决定把从网上淘到的各种杂货和自己的总结放在一起, ...

  6. Golang 的 协程调度机制 与 GOMAXPROCS 性能调优

    作者:林冠宏 / 指尖下的幽灵 掘金:https://juejin.im/user/587f0dfe128fe100570ce2d8 博客:http://www.cnblogs.com/linguan ...

  7. golang:协程安全

    多路复用 Go语言中提供了一个关键字select,通过select可以监听channel上的数据流动.select的用法与switch语法类似,由select开始一个新的选择块,每个选择条件由case ...

  8. Kotlin协程基础

    开发环境 IntelliJ IDEA 2021.2.2 (Community Edition) Kotlin: 212-1.5.10-release-IJ5284.40 我们已经通过第一个例子学会了启 ...

  9. Unity协程基础用法

    //通过StartCoroutine()开始一个协程//通过StopCoroutine();关闭一个协程//通过StopAllCoroutines()方法来实现关闭所有协程void Start(){D ...

随机推荐

  1. 创建ros的程序包--3

    创建ros的程序包(原创博文,转载请标明出处--周学伟http://www.cnblogs.com/zxouxuewei/) 1.一个catkin程序包由什么组成? 一个程序包要想称为catkin程序 ...

  2. jquery 中的回调函数,回调函数(callback)是什么?

    知乎上果然大牛比较多 大神解释如下: 你到一个商店买东西,刚好你要的东西没有货,于是你在店员那里留下了你的电话,过了几天店里有货了,店员就打了你的电话,然后你接到电话后就到店里去取了货.在这个例子里, ...

  3. swift--设置app图标和启动页面

    1,如下图:

  4. python 2.0 s12 day5 常用模块介绍

    模块,用一砣代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来,可能需要多个函数才 ...

  5. kubectl get 输出格式

    常见的输出格式有: * custom-columns=<spec> # 根据自定义列名进行输出,逗号分隔 * custom-columns-file=<filename> # ...

  6. 浅谈 SSD,eMMC,UFS(转自知乎)

    但作为一个计算机体系结构的研究生,在这些名词满天飞的时候,我的好奇心是抑制不住的,想一探这几样技术的究竟.本文不对某一特定事件进行点评,仅从技术角度分析对比一下这三种技术.就算是当做自己的技术储备+科 ...

  7. PHP-CGI 进程 CPU 100% 与 file_get_contents 函数的关系

    [文章作者:张宴 本文版本:v1.0 最后修改:2011.08.05 转载请注明原文链接:http://blog.s135.com/file_get_contents/] 有时候,运行 Nginx.P ...

  8. Set集合遍历方式

    for(String str : set) { System.out.println(str); } for (Iterator iter = set.iterator(); iter.hasNext ...

  9. Uni2D —— 入门(全)

    Uni2D 入门 Uni2D 入门 -- Atlas Uni2D 入门 -- Animation Clip 和 Animation API Uni2D 入门 -- Skeletal Animation ...

  10. tomcat的添加及jar包和jQuery的加载