go语言学习笔记 — 进阶 — 并发编程:轻量级线程goroutine —— 并发与并行

Posted Locutus

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了go语言学习笔记 — 进阶 — 并发编程:轻量级线程goroutine —— 并发与并行相关的知识,希望对你有一定的参考价值。

并发编程

并发指在同一时间内可以执行多个任务。并发编程包含多线程编程、多进程编程、分布式程序等。

  • go语言的并发是指多线程并发,通过goroutine完成
  • goroutine类似线程,可以根据需要创建多个goroutine并发工作
  • goroutine是由go语言的编译器运行时(runtime)调度完成,而线程是由操作系统调度完成
  • 多个goroutine之间通过channel通道进行通信。goroutine和channel是go语言实现CSP(Communicating Sequential Process)并发模式的基础

并发与并行

  • 概念

并发:在不同时间点,把任务交给处理器处理。在同一时间点,任务并不会同时运行。

并行:把每一个任务分配给单个逻辑处理器独立完成。在同一个时间点,任务一定是同时运行。

并发与并行的区别:在同一个时间点,任务是否同时执行。

  • 例子

打电话与吃饭。在吃饭时,电话来了,需要停止吃饭去接电话,电话接完后回来继续吃饭。这个过程是并发执行。在吃饭时,电话来了,边吃饭边接电话。这个过程是并行执行。

在GOMAXPROCS数量与任务数相等时(>=),go程序可以做到并行执行。但一般情况下,go程序都是并发执行。


goroutine

线程池机制:在编写socket网络程序时,我们需要一个线程池,它为每个socket的收发包分配一个线程。在传统逻辑中,开发者需要维护线程数和CPU核数的对应关系,以保证每个任务及时分配到CPU上执行。面对实时的任务分配和并发线程处理需求,线程池就不好用了。

goroutine机制:开发者可以分配足够多的任务,编译器运行时(runtime)自动帮助开发者把任务分配到CPU上,让这些任务尽量并发运行。

go程序从main包的main()函数开始,在go程序启动时,编译器运行时(runtime)自动为main()函数创建一个默认goroutine。

以上是关于go语言学习笔记 — 进阶 — 并发编程:轻量级线程goroutine —— 并发与并行的主要内容,如果未能解决你的问题,请参考以下文章

go语言学习笔记 — 进阶 — 并发编程:为函数创建goroutine

go语言学习笔记 — 进阶 — 并发编程:调整并发的运行性能(GOMAXPROCS)

go语言学习笔记 — 进阶 — 并发编程:通道(channel) —— 在多个goroutine之间通信的管道

go语言学习笔记 — 进阶 — 并发编程:通道(channel)—— 使用channel收发数据

go语言学习笔记 — 进阶 — 并发编程:go语言的协程goroutine,与普通程序的协程coroutine

go语言学习笔记 — 进阶 — 并发编程:通道(channel) —— 各种各样的通道