goroutine

goroutine 是 Go 的并发模型的核心概念。为了理解 goroutine,我们来定义几个术语。第一个是进程。进程是程序的实例,由计算机的操作系统运行。操作系统将一些资源(如内存)与进程相关联,并确保其他进程不能访问它们。进程由一个或多个线程组成一个线程是一个执行单元,由操作系统运行。一个进程中的线程共享对资源的访问。一个 CPU 可以同时执行多少个线程的指令取决于内核的数量。操作系统的工作之一是在 CPU 上调度线程,以确保每个进程(以及进程中的每个线程)都有机会运行。

goroutine 是由 Go 运行时管理的轻量级进程。当 Go 程序启动时,Go 运行时会创建一些线程并启动一个 goroutine 来运行程序。你的程序创建的所有 goroutine(包括程序入口部分)都由 Go 运行时调度器自动分配给这些线程,就像操作系统在 CPU 内核间调度线程一样。这似乎看起来是额外的工作,因为底层操作系统已经包含了一个管理线程和进程的调度器,但 goroutine 有几个好处:

1. 创建 goroutine 比创建线程更快,因为你不是在创建操作系统级的资源。

2. goroutine 的初始栈比线程栈更小,并且可以根据需要增长。这使得 goroutine 的内存效率更高。

3. 在 goroutine 之间切换比在线程之间切换更快,因为 goroutine 之间的切换完全发生在进程内部,避免了操作系统(相对)缓慢的调用。

4. 调度器作为 Go 进程的一部分能够进行优化。当调度器与网络轮询器一起工作时,可以检测 goroutine 何时因为 I/O 阻塞而无法调度。它还与垃圾回收器集成,确保工作在所有操作系统线程之间可以较为平均地分配给 Go 进程。

这些优势使得 Go 程序可以同时生成数百、数千甚至数万个 goroutine。如果你尝试在一种使用本地线程的语言中启动成千上万个线程,程序就会慢到如同乌龟在爬行。

如果你有兴趣了解关于调度器的更多知识,可以听一下 Kavya Joshi在GopherCon 2018上发表的名为“The Scheduler Saga”的演讲(https://oreil.ly/879mk)。

在一个函数调用前放置 go 关键字可以启动一个 goroutine。与其他函数一样,我们可以向它传递参数以初始化其状态。不过,任何函数返回的值都会被忽略。

任何函数都可以作为 goroutine 启动。这与 JavaScript 不同,在 JavaScript 中,只有当使用 async 关键字声明函数时,函数才会异步运行。然而,在 Go 中,大家习惯于用一个封装业务逻辑的闭包来启动 goroutine。该闭包负责管理并发的数据和状态。例如,闭包从通道中读取数值并将其传递给业务逻辑,业务逻辑完全不知道它是在一个 goroutine 中运行的。然后,函数的结果被写回另一个通道。这种职责分离使代码模块化、可测试,并使 API 调用简单,无须关注并发问题:

func process(val int) int {
// do something with val
} func runTingConcurrently(in <-chan int, out chan<- int) {
go func() {
for val := range in {
result := process(val)
out <- result
}
}()
}

Golang入门:协程(goroutine)的更多相关文章

  1. GoLang之协程

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

  2. Golang 之协程详解

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

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

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

  4. GoLang 的协程调度和 GMP 模型

    GoLang 的协程调度和 GMP 模型 GoLang 是怎么启动的 关于 GoLang 的汇编语言,请查阅 参考文献[1] 和 参考文献[2] 编写一个简单的 GoLang 程序 main.go, ...

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

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

  6. 一个有趣的小例子,带你入门协程模块-asyncio

    一个有趣的小例子,带你入门协程模块-asyncio 上篇文章写了关于yield from的用法,简单的了解异步模式,[https://www.cnblogs.com/c-x-a/p/10106031. ...

  7. 『GoLang』协程与通道

    作为一门 21 世纪的语言,Go 原生支持应用之间的通信(网络,客户端和服务端,分布式计算)和程序的并发.程序可以在不同的处理器和计算机上同时执行不同的代码段.Go 语言为构建并发程序的基本代码块是 ...

  8. [golang note] 协程基础

    协程概念 √ 协程通常称为coroutine,在golang中称为goroutine. √ 协程本质上是一种用户态线程,它不需要操作系统来进行抢占式调度,在实际实现中寄存在线程之中. √ 协程系统开销 ...

  9. golang:协程安全

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

  10. [Golang]-5 协程、通道及其缓冲、同步、方向和选择器

    目录 协程 通道 通道缓冲 通道同步 通道方向 通道选择器 协程 Go 协程 在执行上来说是轻量级的线程. 代码演示 import ( "fmt" "time" ...

随机推荐

  1. Qt音视频开发17-海康sdk解码

    一.前言 在视频监控行业领域,海康当之无愧是老大,稳坐第一的宝座很多年了,近期需要将视频监控系统改成采用海康sdk的内核,于是特意去查阅了sdk的使用手册,sdk相关的文档和文件可以直接官网下载到,而 ...

  2. Intellij IDEA IDE中采用Maven集成SSM框架时配置文件的功能和关系说明

    Intellij IDEA IDE中采用Maven集成SSM框架时设计的配置文件主要有:pom.xml.web.xml.applicationContext.xml.springmvc-config. ...

  3. [转]快速的批量修改重命名.net程序的命名空间

    在实际项目中,我们有时会遇到因为项目重构,需要修改命名空间,除了一个一个类修改外,大多数会采用批量替换的方法去重命名.昨天又遇到了此类问题,网上找过的方法说要结合ReSharper重构重命名.于是装上 ...

  4. Solution -「ZJOI 2010」「洛谷 P2570」贪吃的老鼠

    \(\mathscr{Description}\)   Link.   有 \(n\) 块奶酪,每块奶酪出现时段为 \([s_i,t_i]\),体积为 \(V_i\):有 \(m\) 只老鼠要吃奶酪, ...

  5. CDS标准视图:付款锁定原因描述 I_PaymentBlockingReasonText

    视图名称:付款锁定原因描述 I_PaymentBlockingReasonText 视图类型:基础 视图代码: 点击查看代码 //Documentation about annotations can ...

  6. WPF刮刮乐

    WPF刮刮乐 <Window x:Class="WpfApp2.MainWindow" xmlns="http://schemas.microsoft.com/wi ...

  7. docker网络配置:bridge模式、host模式、container模式、none模式

    在docker平台里有四种网络模式,今天继续分享一下它们的常用知识,进一步加深对docker技术的理解. 1.docker网络模式分类 docker run创建Docker容器时,可以用--net选项 ...

  8. 关于CSRF漏洞的一次有趣的交互

    前言 在一次项目中,挖掘了一些CSRF漏洞,将细节提交给客户后,发生了一些有趣的交互,这里简单的先把他叫为薛定谔的CSRF,对其深入了解了一下,且听我细细道来. 薛定谔的CSRF 故事背景是对一个项目 ...

  9. Fluttter基础组件Image的使用

    1.图片 Image 图片组件( Image)是显示图像的组件, Image 组件有多种构造函数 : new Image:从 ImageProvider 获取图像 . new Image.asset: ...

  10. RocksDB 二级缓存

    本文分享自天翼云开发者社区<RocksDB 二级缓存>,作者:b****n RocksDB 团队正在实现对非易失性介质上的块缓存的支持.可以看作是 RocksDB 当前的易失性块缓存的扩展 ...