美文网首页
Go并发编程学习

Go并发编程学习

作者: 纸箱子的一 | 来源:发表于2020-10-31 11:46 被阅读0次

    并发编程
    并发编程的优势:
    • 并发编程能够更客观的表现问题模型
    • 并发编程能够充分利用CPU核心优势
    • 并发编程能够利用CPU与其他硬件固有的异步性
    并发编程的实现模型:
    • 多进程 (系统内核管理)
    • 多线程
    • 基于回调的非阻塞/异步IO
    • 协程
    并发通信模型通常分类:
    • 我们将之前线程加共享内存的方式称之为 “共享内存系统”。现在有一种新的系统模型 “消息传递系统”。
    • Go语言采用消息机制,消息机制认为每个并发单元都是自包含、独立的个体,并且有自己的变量,但在不同并发单元之间这些变量并不共享。每个并发单元的输入输出只有一种,就是消息。Go语言提供的消息通信机制称为channel
    协程的优势:
    与传统的线程和进程相比,协程的优势在于轻量级,可以轻松创建百万个协程而不会导致系统资源衰竭,而线程和进程最多也只能一万多个。
    channel:
    • channel的一般声明方式
    var chanName chan ElementType
    var ch chan int
    • 声明一个map 元素为bool类型
    var m map[string] chan bool
    • 定义一个channel
    ch := make(chan int)
    • channel 常见用法就是读写,将一个数据写入channel的语法:
    ch <- value 向channel中写入数据会导致程序阻塞,直到其他goroutine从这个channel中读取数据。从channel中读取数据的语法是:
    value := <- ch 如果channel之前没有写入数据,那么从channel中读取数据也会导致程序阻塞,直到该channel写入数据为止。
    select:
    select 的用法同switch语句相似,与之相比,select多了很多限制,select语句块中的case 后边必须是一个IO操作。
    select{
    case <-chan1 :
    // 如果chan1成功读取数据,则进行该case操作
    case chan2<-1 :
    // 如果chan2成功写入数据,则进行该case操作
    default:
    // 如果上边两case都不成立,进行该操作
    }
    缓冲机制:
    之前创建的都是不带缓冲的channel,这种对于单数据的场景还可以应付,但是对于需要持续大数据量的场景下就不合适了,需要加入缓冲区来达到一种消息队列的效果。
    ch := make(chan int , 1024) 创建一个缓冲区大小为1024的int 类型channel。在这种具有缓冲区的channel下,即使没有数据的读取方,也可以持续写入,在缓冲区没有填满前不会发生阻塞。
    超时机制:
    在并发编程中最需要注意的就是超时问题,即当channel中写数据时,channel已经满了,或者从channel中读取数据时,channel中为空,如果不正确处理这些问题,就会导致goroutine锁死。Go语言没有直接提供超时处理机制,但是我们可以使用select机制。因为select机制就是只要有一个case已经完成,程序就会继续往下走,而不会考虑其他case情况。

        select {
        // 从chs[1] 中读取数据
        case <-chs[1]:
            // 一直没有从chs[1]中读取到数据,但是从timeout中读取到数据,那么程序接着执行
        case <-timeout:
        }
    

    相关文章

      网友评论

          本文标题:Go并发编程学习

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