这是我参与「第五届青训营 」伴学笔记创作活动的第7天
语言进阶
(1). 并发与并行
并发与并行的概念是什么,有什么区别呢?
并发是指一个处理器同时处理多个任务。
并行是指多个处理器或者是多核的处理器同时处理多个不同的任务。
并发是指逻辑层面上的同时发生,而并行是在物理层面上的同时发生。
对于多线程的程序,多线程程序可以在多核系统上发挥出优势,在多核上可以实现真正的并行;而在单核CPU上运行时,只是表象上的“并行”即类似于并发。
Golang的特性可以说它是为了并发而生的语言,Go语言的并发主要是通过Goroutine实现的,Goroutine类似于线程,属于用户态的线程,可以根据需要,创建成相当多数目的Goroutine从而进行并发工作。和线程的区别是,Goroutine是由Go语言的运行时调度完成,而线程是由操作系统调度完成。
Golang还提供Channel在多个Goroutine间进行通信。Goroutine和Channel这两种方式,体现了CSP并发模式,实现了其基础。
(2). Goroutine
先介绍一下进程和线程的关系。
- 进程就是程序在操作系统中的一次执行过程,是系统进行资源分配和调度的基本单位。
- 线程是进程的一个执行实例,是程序执行的最小单元,它是比进程更小的能独立运行的基本单位。
- 一个进程可以创建和销毁多个线程,同一个进程中的多个线程可以并发执行。
- 一个程序至少有一个进程,一个进程至少有一个线程。
Golang有主线程/进程和协程的说法,其中协程可以在主线程上存在多个,是更轻量的线程。具有独立的栈空间、共享程序堆空间,其调度由用户控制,并且协程是轻量级的线程,这些是Goroutine的特点。