详解context包,看这一篇就够了 您所在的位置:网站首页 context的词根 详解context包,看这一篇就够了

详解context包,看这一篇就够了

2024-07-13 23:59| 来源: 网络整理| 查看: 265

前言

最近在项目开发时,经常使用到Context这个包。context.Context是Go语言中独特的设计,在其他编程语言中我们很少见到类似的概念。所以这一期我们就来好好讲一讲Context的基本概念与实际使用,麻麻再也不担心我的并发编程啦~~~。

什么是context

在理解context包之前,我们应该熟悉两个概念,因为这能加深你对context的理解。

1. Goroutine

Goroutine是一个轻量级的执行线程,多个Goroutine比一个线程轻量所以管理他们消耗的资源相对更少。Goroutine是Go中最基本的执行单元,每一个Go程序至少有一个Goroutine:主Goroutine。程序启动时会自动创建。这里为了大家能更好的理解Goroutine,我们先来看一看线程与协程的概念。

线程(Thread)

线程是一种轻量级进程,是CPU调度的最小单位。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属于一个进程的其他线程共享进程所拥有的全部资源。线程拥有自己独立的栈和共享的堆,共享堆,不共享栈,线程的切换一般也由操作系统调度。

协程(coroutine)

又称为微线程与子例程一样,协程也是一种程序组建,相对子例程而言,协程更为灵活,但在实践中使用没有子例程那样广泛。和线程类似,共享堆,不共享栈,协程的切换一般由程序员在代码中显式控制。他避免了上下文切换的额外耗费,兼顾了多线程的优点,简化了高并发程序的复杂。

Goroutine和其他语言的协程(coroutine)在使用方式上类似,但从字面意义上来看不同(一个是Goroutine,一个是coroutine),再就是协程是一种协作任务控制机制,在最简单的意义上,协程不是并发的,而Goroutine支持并发的。因此Goroutine可以理解为一种Go语言的协程。同时它可以运行在一个或多个线程上。

我们来看一个简单示例:

func Hello()  { fmt.Println("hello everybody , I'm asong")}

func main()  { go Hello() fmt.Println("Golang梦工厂")}

上面的程序,我们使用go又开启了一个Goroutine执行Hello方法,但是我们运行这个程序,运行结果如下:

Golang梦工厂

这里出现这个问题的原因是我们启动的goroutine在main执行完就退出了,所以为了main等待这个Goroutine执行完,我们就需要一些方法,让goroutine告诉main执行完了,这里就需要通道了。

2. 通道

这是 goroutine 之间的沟通渠道。当您想要将结果或错误,或任何其他类型的信息从一个 goroutine 传递到另一个 goroutine 时就可以使用通道。通道是有类型的,可以是 int 类型的通道接收整数或错误类型的接收错误等。

假设有个 int 类型的通道 ch,如果你想发一些信息到这个通道,语法是 ch



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

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