Go语言学习教程(十五)

本文详细介绍了Go语言的并发特性,包括线程休眠、延迟执行、goroutine、WaitGroup、互斥锁、读写锁以及channel的使用。通过实例展示了如何在Go中进行高效的并发控制,确保程序的安全性和正确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、线程休眠

* Go语言中main()函数为主线程(协程),程序是从上向下执行的

* 可以通过time包下的Sleep(n)让程序阻塞多少纳秒

   //单位是纳秒,表示阻塞多长时间

   //e9表示10的9次方

   time.Sleep(1e9)

二、延迟执行

* 延迟指定时间后执行一次,但是需要注意在触发时程序没有结束

    fmt.Println("开始")

   //2秒后执行匿名函数

   time.AfterFunc(2e9, func() {

      fmt.Println("延迟延迟触发")

   })

   time.Sleep(10e9)//一定要休眠,否则程序结束了

   fmt.Println("结束")

三、goroutine简介

* Golang中最迷人的一个优点就是从语言层面就支持并发

* 在Golang中的goroutine(协程)类似于其他语言的线程

* 并发和并行

    * 并行(parallelism)指不同的代码片段同时在不同的物理处理器上支持

    * 并发(concurrency)指同时管理多个事情,物理处理器上可能运行某个内容一半后就处理其他事情

    * 在一般看来并发的性能要好于并行.因为计算机的物理资源是固定的,较少的,而程序需要执行的内容是很多的.所以并发是”以较少的资源去去做更多事情”

* 几种主流并发模型

    * 多线程,每个线程只处理一个请求,只有请求结束后,对应的线程才会接收下一个请求.这种模式在高并发下,性能开销极大.

    * 基于回调的异步IO.在程序运行过程中可能产生大量回调导致维护成本加大,程序执行流程也不便于思维

    * 协程.不需要抢占式调用,可以有效提升线程任务的并发性,弥补了多线程模式的缺点;Golang在语言层面就支持,而其他语言很少支持

* goroutine的语法

    * 表达式可以是一条语句

    * 表达式也可以是函数,函数返回值即使有,也无效,当函数执行完成此goroutine自动结束

    go 表达式

四、WaitGroup简介

* Golang中sync包提供了基本同步基元,如互斥锁等.除了Once和WaitGroup类型, 大部分都只适用于低水平程序线程,高水平同步线程使用channel通信更好一些

* WaitGroup直译为等待组,其实就是计数器,只要计数器中有内容将一直阻塞

* 在Golang中WaitGroup存在于sync包中,在sync包中类型都是不应该被拷贝的

* Go语言标准库中WaitGroup只有三个方法

    * Add(delta int)表示向内部计数器添加增量(delta),其中参数delta可以是负数

    * Done()表示减少WaitGroup计数器的值,应当在程序最后执行.相当于Add(-1)

    * Wait()表示阻塞直到WaitGroup计数器为0

* 使用WaitGroup可以有效

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小陈工

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值