美文网首页
Go语言中的并发编程

Go语言中的并发编程

作者: 陈光环_18 | 来源:发表于2021-01-24 20:44 被阅读0次

    并发与并行

    并发:同一时间段内执行多个任务
    并行:同一时刻执行多个任务
            Go语言的并发通过goroutine实现。goroutine类似于线程,属于用户态的线程,我们可以根据需要创建成千上万个goroutine并发工作。goroutine是由Go语言的运行时(runtime)调度完成,而线程是由操作系统调度完成。

            Go语言还提供channel在多个goroutine间进行通信。goroutine和channel是 Go 语言秉承的 CSP并发模式的重要实现基础。

    goroutine

            Go语言中的goroutine是,程序员只需要定义很多个任务,让系统去帮助我们把这些任务分配到CPU上实现并发执行的一种机制,goroutine的概念类似于线程,但 goroutine是由Go的运行时(runtime)调度和管理的。Go程序会智能地将 goroutine 中的任务合理地分配给每个CPU。Go语言之所以被称为现代化的编程语言,就是因为它在语言层面已经内置了调度和上下文切换的机制。
            在Go语言编程中你不需要去自己写进程、线程、协程,你的技能包里只有一个技能–goroutine,当你需要让某个任务并发执行的时候,你只需要把这个任务包装成一个函数,开启一个goroutine去执行这个函数就可以了,就是这么简单粗暴。

    channel

            Go语言的并发模型是CSP,提倡通过通信共享内存而不是通过共享内存而实现通信
            如果说goroutine是Go程序并发的执行体,channel就是它们之间的连接。channel是可以让一个goroutine发送特定值到另一个goroutine的通信机制。
            Go 语言中的通道是一种特殊的类型。通道像一个传送带或者队列,总是遵循先入先出(FIFO)的规则,保证收发数据的顺序。每一个通道都是一个具体类型的导管,也就是声明channel的时候需要为其指定元素类型。

    select多路复用

            select的使用类似于switch语句,它有一系列case分支和一个默认的分支。每个case会对应一个通道的通信(接收或发送)过程。select会一直等待,直到某个case的通信操作完成时,就会执行case分支对应的语句。
                    使用select语句能提高代码的可读性。
                            可处理一个或多个channel的发送/接收操作。
                            如果多个case同时满足,select会随机选择一个。
                            对于没有case的select{}会一直等待,可用于阻塞main函数。

    并发安全和锁

            有时候在Go代码中可能会存在多个goroutine同时操作一个资源(临界区),这种情况会发生竞态问题(数据竞态)。

    互斥锁

            互斥锁是一种常用的控制共享资源访问的方法,它能够保证同时只有一个goroutine可以访问共享资源。Go语言中使用sync包的Mutex类型来实现互斥锁。 

    读写互斥锁

            读写锁在Go语言中使用sync包中的RWMutex类型。
            读写锁分为两种:读锁和写锁。当一个goroutine获取读锁之后,其他的goroutine如果是获取读锁会继续获得锁,如果是获取写锁就会等待;当一个goroutine获取写锁之后,其他的goroutine无论是获取读锁还是写锁都会等待。

    相关文章

      网友评论

          本文标题:Go语言中的并发编程

          本文链接:https://www.haomeiwen.com/subject/tsfvzktx.html