Go语言 您所在的位置:网站首页 go语言开发工具包是什么 Go语言

Go语言

2024-07-12 22:48| 来源: 网络整理| 查看: 265

并发和并行

并行(parallel):指在同一时刻,有多条指令在多个处理器上同时执行。 在这里插入图片描述 并发(concurrency):指在同一时刻只能有一条指令执行,但多个进程指令被快速的轮换执行,使得在宏观上具有多个进程同时执行的效果,但在微观上并不是同时执行的,只是把时间分成若干段,使多个进程快速交替的执行。 在这里插入图片描述

理解

并行是两个队列同时使用两台咖啡机 并发是两个队列交替使用一台咖啡机 在这里插入图片描述

Go语言并发优势

有人把 Go 比作 21 世纪的C语言,第一是因为 Go 语言设计简单,第二,21世纪最重要的就是并发程序设计,而Go从语言层面就支持了并法。同时,并发程序的内存管理有时候是非常复杂的,而Go语言提供了自动垃圾回收机制。 Go 语言为并发编程而内置的上层 API 基于** CSP(commnicating sequential processes,顺序通信进程)模型**。这就高味着显式锁都是可以避免的,因为Go语言通过安全的通道发送和接受数据以实现同步,这大大地简化了并发程序的编写。 一般情况下,一个普通的桌面计算机跑十几二十个线程就有点负载过大了,但是同样这台机器却可以轻松地让成百上千甚至过万个 goroutine 进行资源竞争。

goroutine

goroutine 是 Go 并行设计的核心。goroutine 说到底其实就是协程,但是它比线程更小,十几个 goroutine 可能体现在底层就是五六个线程,Go语言内部实现这些 goroutine 之间的内存共享。执行 goroutine只需极少的栈内存(大概是4-5KB),也会根据相应的数据伸缩。也正因为如此,可同时运行成千上万个并发任务。goroutine 比 thread 更易用、更高效、更轻便。

创建goroutine

只需在函数调用语句前添加 go关键字,就可创建并发执行单元。开发人员无需了解任何执行细节,调度器会自动将其安排到合适的系统线程上执行。 在并发编程里,我们通常想讲一个过程切分成几块,然后让每个goroutine 各自负责一块工作。当一个程序启动时,其主函数即在一个单独的 goroutine 中运行,我们叫它 main goroutine。新的 goroutine 会用 go语句来创建。

实现 package main import ( "fmt" "time" ) func newTask() { for { fmt.Println("this is a new goroutine") time.Sleep(time.Second) } } func main() { go newTask() //新建一个协程 for { fmt.Println("this is a main goroutine") time.Sleep(time.Second) } }

在这里插入图片描述

添加go关键字,Go语言一看到go关键字就会拆分出来一个新的协程一定要写在前面两个协程是互不相干的,谁先执行时看任务调度的。主协程退出以后子协程也会跟着退出 在这里插入图片描述有可能会导致这样的情况,子协程还没有来得及打印,主协程已经退出了,这样子协程也会跟着退出。 在这里插入图片描述 runtime包 Gosched

runtimc.Gosched() 用于让出 CPU时间片,让出当前 goroutine 的执行权限,调度器安排其他等待的任务运行,并在下次某个时候从该位置恢复执行。 这就像跑接力赛,A 跑了一会碰到代码runtime,Gosched() 就把接力棒交给 B 了,A 歇着了B 继续跑。 在这里插入图片描述 没有runtime.Gosched()的时候,还轮不到执行子协程 在这里插入图片描述

Goexit

调用 runtime.Goexit0) 将立即终止当前 goroutine 执行,调度器确保所有已注册 defer 延迟调用被执行。 在这里插入图片描述

GOMAXPROCS

调用runtime.GOMAXPROCS()用来设置可以并行计算的CPU核数的最大值,并返回之前的值。 在这里插入图片描述

交替进行n := runtime.GOMAXPROCS(2)交替的频率会快一点 在这里插入图片描述 资源竞争

在这里插入图片描述



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有