
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
并发编程开发是目前大多数软件开发项目都会要求满足的一个开发需求,而本文我们就通过案例分析来简单了解一下,Go语言如何实现并发编程开发。
简单来说所谓并发编程是指在一个处理器上“同时”处理多个任务;宏观上并发是指在一段时间内,有多个程序在同时运行;在微观上并发是指在同一时刻只能有一条指令执行,但多个程序指令被快速的轮换执行,使得在宏观上具有多个进程同时执行的效果,但在微观上并不是同时执行的,只是把时间分成若干段,使多个程序快速交替的执行。
在许多环境中,实现对共享变量的正确访问使得并发编程变得困难。Go鼓励通过共享值在通道上传递,实际上没有被单独的执行线程主动共享。在任何给定时刻只有一个线程可以访问该值,因此在数据竞争在设计上是不会发生的。单线程程序不需要同步原语,也不需要同步。如果通信是同步器,则仍然不需要其他同步。例如,Unix管道就非常适合这个模型;尽管Go的并发方法起源于Hoare的通信顺序进程(CSP),但也可以被视为Unix管道的类型安全泛化。
并发原语
在操作系统中,往往设计一些完成特定功能的、不可中断的过程,这些不可中断的过程称为原语。并发原语就是在编程语言设计之初以及后续的扩展过程中,专门为并发设计而开发的关键词或代码片段或一部分功能,进而能够为该语言实现并发提供更好的支持。
协程-Goroutine
在Go语言中,每一个并发的执行单元叫作一个goroutine,它是一个轻量级的执行线程,被称为协程,有别于线程、进程程等。协程以简单的模型运行,在同一地址空间中与其他运行协程并发执行的函数;只需要分配堆栈空间。堆栈开始时很小因此开销很低,并按需分配实现堆空间申请和释放。线程被多路复用到多个操作系统线程上,所以如果一个线程阻塞了,比如在等待I/O时,其他线程会继续运行。Goroutines设计隐藏了线程创建和管理的许多复杂性。在Go语言开启协程非常简单,在函数或方法调用前加上go关键字,例如有一个函数调用f(s),这种调用它的方式是同步,而在程序中使用gof(s)调用,则会新开协程将与调用协程并发执行。
通道-Channel
Channels是一种编程结构,允许在代码的不同部分之间移动数据,通常来自不同的goroutine。与映射一样,Channels通道也使用make分配,返回对底层数据结构的引用。如果提供了一个可选的整数参数则可设置通道的缓冲区大小。对于非缓冲通道或同步通道,默认值为零。无缓冲通道将通信(值的交换)与同步结合起来,保证两个计算(例程)处于已知状态。
通道是连接并发程序的管道,可以从一个运行协程向通道发送值,并从另一个运行协程接收这些值。默认情况下,通道是无缓冲的,这意味着只有当有相应的接收(<-chan)准备接收发送的值时,通道才会接受发送(chan<-)。缓冲通道接受有限数量的值,而没有相应的接收器接收这些值。还可以使用通道来同步跨程序的执行,使用阻塞接收来等待程序完成,而需要等待多个协程完成时可能更多会使用WaitGroup,后面再介绍;当使用通道作为函数参数时,可以指定通道是只发送还是接收值,也叫做定向通道,其增加了程序的类型安全性。
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请加抖音太原达内IT培训学习了解。