并发Goroutine&Channel
2023-10-6
| 2023-10-6
0  |  阅读时长 0 分钟
Created time
Oct 6, 2023 12:50 PM
date
status
category
Origin
summary
tags
type
URL
icon
password
slug

并发Goroutine&Channel

并发编程介绍

在本章节,我们将介绍一下,什么是并发编程,什么是并行,并发,串行。Go语言如何实现并发编程,以及实现的原理,goroutine的使用。runtime包、sync包的介绍。channel通道的使用,以及缓冲通道,定向通道。select语句,time包中和并发编程相关的函数介绍。最后我们介绍一下CSP模型。

并发性Concurrency

怎么来理解多任务呢?其实就是指我们的操作系统可以同时执行多个任务。举个例子,你一边听音乐,一边刷微博,一边聊QQ,一边用Markdown写作业,这就是多任务,至少同时有4个任务正在运行。还有很多任务悄悄地在后台同时运行着,只是界面上没有显示而已。

什么是并发

Go是并发语言,而不是并行语言。在讨论如何在Go中进行并发处理之前,我们首先必须了解什么是并发,以及它与并行性有什么不同。(Go is a concurrent language and not a parallel one. )。
并发性Concurrency是同时处理许多事情的能力。举个例子,假设一个人在晨跑。在晨跑时,他的鞋带松了。现在这个人停止跑步,系鞋带,然后又开始跑步。这是一个典型的并发性示例。这个人能够同时处理跑步和系鞋带,这是一个人能够同时处理很多事情。什么是并行性parallelism,它与并发concurrency有什么不同? 并行就是同时做很多事情。这听起来可能与并发类似,但实际上是不同的。让我们用同样的慢跑例子更好地理解它。在这种情况下,我们假设这个人正在慢跑,并且使用它的手机听音乐。在这种情况下,一个人一边慢跑一边听音乐,那就是他同时在做很多事情。这就是所谓的并行性(parallelism)。
并发性和并行性——一种技术上的观点。 假设我们正在编写一个web浏览器。web浏览器有各种组件。其中两个是web页面呈现区域和下载文件从internet下载的下载器。假设我们以这样的方式构建了浏览器的代码,这样每个组件都可以独立地执行。当这个浏览器运行在单个核处理器中时,处理器将在浏览器的两个组件之间进行上下文切换。它可能会下载一个文件一段时间,然后它可能会切换到呈现用户请求的网页的html。这就是所谓的并发性。并发进程从不同的时间点开始,它们的执行周期重叠。在这种情况下,下载和呈现从不同的时间点开始,它们的执行重叠。
假设同一浏览器运行在多核处理器上。在这种情况下,文件下载组件和HTML呈现组件可能同时在不同的内核中运行。这就是所谓的并行性。
notion image

并行性Parallelism不会总是导致更快的执行时间。这是因为并行运行的组件可能需要相互通信。例如,在我们的浏览器中,当文件下载完成时,应该将其传递给用户,比如使用弹出窗口。这种通信发生在负责下载的组件和负责呈现用户界面的组件之间。这种通信开销在并发concurrent 系统中很低。当组件在多个内核中并行concurrent 运行时,这种通信开销很高。因此,并行程序并不总是导致更快的执行时间!
notion image

进程、线程、协程

goroutine与进程和协程有什么不同?

goroutine是Go语言中的一种并发机制,它是一种轻量级的线程,由Go语言运行时本身的算法实现​[^1^](https://blog.csdn.net/oguro/article/details/115551561)​。goroutine不是线程,它是一个协程​[^1^](https://blog.csdn.net/oguro/article/details/115551561)​。goroutine可以看作是一种协作式的线程​[^2^](https://zhuanlan.zhihu.com/p/60613088)​。与进程和线程不同,goroutine是由Go语言运行时本身的算法实现的,而不是由操作系统内核调度​[^1^](https://blog.csdn.net/oguro/article/details/115551561)。
进程和线程有什么不同?
进程和线程是操作系统中的两个基本概念。进程是指一个程序在一个数据集合上的一次执行过程,是系统进行资源分配和调度的一个独立单位,重点在系统调度和单独的单位,也就是说进程是可以独立运行的一段程序。线程是进程中的一个实体,是被系统独立调度和分派CPU时间的基本单位。线程是进程中的一个实体,是被系统独立调度和分派CPU时间的基本单位。
goroutine与进程和协程有什么不同?
Goroutine是Go语言中实现并发的一种机制,它是一种轻量级的线程,由Go运行时管理​[^1^](https://zhuanlan.zhihu.com/p/77205289)。Goroutine与进程和协程有以下几个不同点:
请给我一个Goroutine的例子。
好的,我可以给你一个Goroutine的例子。Goroutine是一种使用go关键字来调用函数或方法的方式,它可以让函数或方法在后台并发地执行​[^1^](https://www.programiz.com/golang/goroutines)。例如,下面的代码展示了如何使用Goroutine来同时运行两个函数:
输出结果可能是:

参考资料

Go语言函数作为参数传递给其他函数或方法收集未整理的网课资源
Loading...