一、线程休眠
* 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可以有效

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

被折叠的 条评论
为什么被折叠?



