美文网首页
Go并发编程

Go并发编程

作者: zww007 | 来源:发表于2020-03-14 10:08 被阅读0次

    常见并发模型

    • 进程 & 线程(Apache)C10K
    • 异步非阻塞(Nginx,Libevent,NodeJS) 复杂度高
    • 协程 (Golang,Erlang,Lua)

    并发与并行

    • 并发:指同一时刻,系统通过调度,来回切换交替的运行多个任务,"看起来"是同时进行
    • 并行:指同一时刻,两个任务"真正的"同时进行


      图一.png

    Golang并发实现

    • 程序并发执行(goroutine)
    • 多个goroutine间的数据同步和通信(channels)
    • 多个channel选择数据读取或写入(select)
    Goroutine(程序并发执行)
    foo() //执行函数foo,程序等待函数foo返回
    
    go foo() //执行函数foo
    bar() //不用等待foo返回
    
    Channels(多个goroutine间的数据同步和通信)
    c := make(chan string) //创建一个channel
    go func() {
        time.Sleep(time.Second*1)
       c <- "hello world" //发送数据到channel中
    }()
    msg := <- c //阻塞直到接收到数据
    
    Select(从多个channel中读取或写入数据)
    select{
    case v := <-c1:
        fmt.Println("channel 1 send",v)
    case v := <-c2:
        fmt.Println("channel 2 send",v)
    default: //可选
        fmt.Println("channel was ready")
    }
    //c1和c2同时有数据时,select随机选一个
    

    相关文章

      网友评论

          本文标题:Go并发编程

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