GO语言工程实践 | 青训营

87 阅读2分钟

并发VS并行

并发是指多个任务在同一时间段内交替执行,每个任务都有可能被中断或暂停,然后切换到其他任务继续执行。在并发执行中,多个任务共享时间片,通过任务切换来实现任务间的交替执行,同一时间段内执行多个任务。多线程程序在一个核的cup上进行。
并行是指多个任务同时执行,每个任务都在不同的处理单元上独立运行,互不干扰。在并行执行中,多个任务可以并发地进行,充分利用多个处理单元的能力,同一时刻执行多个任务。多线程程序在多个核上的cup上进行。

Goroutine

线程是进程中的一个执行单元,一个进程可以包含多个线程。线程共享进程的地址空间和资源,它们可以访问共享的数据和变量。线程的切换代价较低,因为它们共享了进程的上下文。特点:内核态,线程跑多个协程,栈MB级别。
协程是一种轻量级的线程,也被称为用户级线程。与线程相比,协程的切换更加灵活和高效。协程的切换是由程序自身控制的,不需要操作系统的干预,切换代价非常低。协程可以在同一个线程中并发执行,通过协程的切换来实现任务的交替执行。特点:用户态,轻量级线程,栈KB级别。
Goroutine 是 GO 语言支持并发的核心,在一个GO程序中同时创建成百上千个goroutine是非常普遍的,一个goroutine会以一个很小的栈开始其生命周期。Go语言中使用 goroutine 非常简单,只需要在函数或方法调用前加上go 关键字就可以创建一个 goroutine ,从而让该函数或方法在新创建的 goroutine 中执行。
特性:1.执行是非阻塞的,不会进行等待;2.没有父子概念,所有的goroutine都是平等的

channel

channel是goroutine与goroutine之间的通道,可以让一个goroutine发送特定值到另一个goroutine。并且遵循先入先出原则,保证数据的顺序。
通过chan可以常见多种通道,无缓冲通道,缓冲通道,单向通道。
无缓冲通道:要求两边的goroutine都做好准备,不然会发生阻塞。
缓冲通道:通道具有容量值,只要有值和空间便不会发生阻塞。
单向通道只能发送或接受数据。