Go并发快速入门:Goroutine

这篇具有很好参考价值的文章主要介绍了Go并发快速入门:Goroutine。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Go并发:Goroutine

1.并发基础概念:进程、线程、协程

(1) 进程

可以比作食材加工的一系列动作

进程就是程序在操作系统中的一次执行过程,是由系统进行资源分配和调度的基本单位,进程是一个动态概念,是程序在执行过程中分配和管理资源的基本单位,每一个进程都有一个自己的地址空间。一个进程至少有5种基本状态:初始态、执行态、等待状态、就绪状态、终止状态。

通俗讲: 进程就是一个正在执行的程序。

[一般情况] 一个程序一个进程

[多进程]] 一个程序多个进程

可以在终端输入以下内容,来列出所有的进程

ps -A

比如在Windows系统中,一个运行的xx.exe就是一个进程。

Go并发快速入门:Goroutine,6.824,golang,开发语言,后端

(2) 线程

可以比作食材加工的某一个动作

线程是运算调度的最小单元,是进程中的一个执行任务(控制单元),负责当前进程中程序的执行。一个进程至少有一个线程,一个进程可以运行多个线程,多个线程可共享数据。

进程与线程的区别如下

根本区别:进程是操作系统资源分配的基本单位,而线程是处理器任务调度和执行的基本单位

资源开销:每个进程都有独立的代码和数据空间(程序上下文),程序之间的切换会有较大的开销;线程可以看做轻量级的进程,同一类线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序计数器(PC),线程之间切换的开销小。

包含关系:如果一个进程内有多个线程,则执行过程不是一条线的,而是多条线(线程)共同完成的;线程是进程的一部分,所以线程也被称为轻权进程或者轻量级进程。

内存分配:同一进程的线程共享本进程的地址空间和资源,而进程之间的地址空间和资源是相互独立的

影响关系:一个进程崩溃后,在保护模式下不会对其他进程产生影响,但是一个线程崩溃整个进程都死掉。所以多进程要比多线程健壮。

执行过程:每个独立的进程有程序运行的入口、顺序执行序列和程序出口。但是线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制,两者均可并发执行

查看线程

  1. 进入 terminal
  2. 输入命令 ps-M[pid]
  3. 查看对应 pid 线程
(3) 协程

协程(goroutine) 是轻量级的执行线程。

Go并发快速入门:Goroutine,6.824,golang,开发语言,后端
Go并发快速入门:Goroutine,6.824,golang,开发语言,后端

实操

假设我们有一个函数叫做 action()。 我们一般会这样 同步地 调用它使用 go action() 在一个协程中调用这个函数。 这个新的 Go 协程将会 并发地 执行这个函数。

package main 

import (
	"fmt"
	// "time"
)

func action() {
	fmt.Println("Test Goroutine")
}

func main() {
	go action()

	// time.Sleep(2 * time.Second)
}

Go并发快速入门:Goroutine,6.824,golang,开发语言,后端

可见咩有任何输出,把注释内容取消注释再运行

Go并发快速入门:Goroutine,6.824,golang,开发语言,后端

为什么要沉睡?

go 语言运行非常快,若没有沉睡,可能会导致

“协程还没有执行完, main 函数已经结束了”

最终导致协程结束前, main 函数已经被销毁

因此我们需要让主进程去等待一定时间的子协程,才能得到子协程的输出

2.多协程核心机理

Go并发快速入门:Goroutine,6.824,golang,开发语言,后端

步骤

  • 任务切片/分配
  • 启动多个协程
  • 合并多个协程结果

Go并发快速入门:Goroutine,6.824,golang,开发语言,后端

使用场景

  • 运算量比较多
  • 协程间依赖性比较弱

3.多协程等待实操

Go并发快速入门:Goroutine,6.824,golang,开发语言,后端

我们可以使用通道来同步协程之间的执行状态。使用 wait group 等待多个协程完成

package main

import (
	"fmt"
	"sync"
)

func main() {
	var wg sync.WaitGroup

	for i := 0; i < 2; i ++ {
		wg.Add(1)
		go func(num int) {
			fmt.Printf("Goroutine Test %d\n", num)
			wg.Done()
		}(i)
	}

	wg.Wait()
}

Go并发快速入门:Goroutine,6.824,golang,开发语言,后端

更多细节清查阅 waitgroup

Go by Example 中文版: WaitGroup (gobyexample-cn.github.io)文章来源地址https://www.toymoban.com/news/detail-815154.html

到了这里,关于Go并发快速入门:Goroutine的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Golang单元测试与Goroutine详解 | 并发、MPG模式及CPU利用

    深入探讨Golang中单元测试方法及Goroutine的使用。了解并发与并行概念,MPG模式以及CPU相关函数的应用。解决协程并行中的资源竞争问题。

    2024年02月10日
    浏览(44)
  • 「实验记录」MIT 6.824 Raft Lab2A Leader Election

    MIT-6.824 2020 课程官网 Lab2: Raft 实验主页 simviso 精品付费翻译 MIT 6.824 课程 source code 的 Gitee 地址 Lab2A: Leader Election 的 Gitee 地址 课程官网提供的 Lab 代码下载地址,我没有访问成功,于是我从 Github 其他用户那里 clone 到干净的源码,有需要可以访问我的 Gitee 获取 提出 Raft 的主要

    2024年02月05日
    浏览(38)
  • Golang中的管道(channel) 、goroutine与channel实现并发、单向管道、select多路复用以及goroutine panic处理

    目录 管道(channel) 无缓冲管道 有缓冲管道 需要注意 goroutine与channel实现并发 单向管道 定义单向管道 将双向管道转换为单向管道 单向管道作为函数参数 单向管道的代码示例 select多路复用 案例演示 goroutine panic处理 案例演示 管道(channel)是 Go 语言中实现并发的一种方式,

    2024年02月06日
    浏览(47)
  • 「实验记录」MIT 6.824 KVRaft Lab3B With Log Compaction

    MIT-6.824 2020 课程官网 Lab3: KVRaft 实验主页 simviso 精品付费翻译 MIT 6.824 课程 Paper - Raft extended version source code 的 Gitee 地址 Lab3B: KVRaft with log compaction的 Gitee 地址 课程官网提供的 Lab 代码下载地址,我没有访问成功,于是我从 Github 其他用户那里 clone 到干净的源码,有需要可以访

    2024年02月15日
    浏览(47)
  • Go并发编程 Goroutine、Channel、Select、Mutex锁、sync、Atomic等

    本文所有实例代码运行go版本: go version go1.18.10 windows/amd64 串行:所有任务一件一件做,按照事先的顺序依次执行,没有被执行到的任务只能等待。最终执行完的时间等于各个子任务之和。 并发:是以交替的方式利用 等待 某个任务的时间来处理其他任务计算逻辑,在计算机

    2024年02月07日
    浏览(52)
  • Go语言入门12(协程 goroutine)

    进程 ​当运行一个应用程序的时候,操作系统会为这个应用程序启动一个进程。可以将这个进程看作一个包含了应用程序在运行中需要用到和维护的各种资源的容器。这些资源包括但不限于内存地址空间、文件和设备的句柄以及线程 线程 ​一个线程是一个执行空间,这个空

    2023年04月26日
    浏览(40)
  • Golang扫盲式学习——GO并发 | (一)

    并行:同一个时间段内多个任务同时在不同的CPU核心上执行。强调同一时刻多个任务之间的” 同时执行 “。 并发:同一个时间段内多个任务都在进展。强调多个任务间的” 交替执行 “。 随着硬件水平的提高,现在的终端主机都是多个CPU,每个CPU都是多核结构。当多个CPU同

    2024年02月07日
    浏览(45)
  • golang协程goroutine教程

    项目经常遇到一些批量任务执行太慢,需要开启多线程去处理,记录下在 Golang 中协程使用的一些操作。 协程是计算机程序的一类组件,推广了协作式多任务的子例程,允许执行被挂起与被恢复。相对子例程而言,协程更为一般和灵活,但在实践中使用没有子例程那样广泛。

    2024年02月02日
    浏览(41)
  • golang学习-goroutine

    1、goroutine协程 goroutine 是 Go 语言支持并发的核心,一个goroutine会以一个很小的栈开始其生命周期,一般只需要2KB。区别于操作系统线程由系统内核进行调度, goroutine 是由Go运行时(runtime)负责调度。例如Go运行时会智能地将 m个goroutine 合理地分配给n个操作系统线程,实现类

    2024年01月18日
    浏览(41)
  • golang Goroutine超时控制

     https://github.com/zeromicro/go-zero/blob/master/core/fx/timeout.go  一文搞懂 Go 超时控制_51CTO博客_go 超时处理

    2024年02月09日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包