• Go Concurrency or Parallel


    关于并发和并行,先看两个示例

    示例1

    package main
    
    import "fmt"
    
    var quit = make(chan int)
    func foo6(){
        for i:=0; i<10; i++ {
            fmt.Print(i)
        }
        quit <-0
    }
    
    func main() {
        go foo6()
        go foo6()
    
        for i:=0; i<2; i++ {
            <-quit
        }
    }

    输出结果:
     0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9

    疑问:
      难道是顺序执行?

    示例2:

    package main
    
    import (
        "fmt"
        "time"
    )
    
    var quit = make(chan int)
    
    func foo6(){
        for i:=0; i<10; i++ {
            fmt.Print(" ",i)
        }
        time.Sleep(1 * time.Second)
        quit <-0
    }
    
    func main() {
        var startTime = time.Now()
        go foo6()
        go foo6()
    
        for i:=0; i<2; i++ {
            <-quit
        }
        fmt.Println("
    ", time.Now().Sub(startTime) )
    }
    
    
    输出结果:
     0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9
     1.003077544s
    
    疑问:
       显然只花费了1秒多...肯定是并行的...

    总结:

    默认地, Go所有的goroutines只能在一个线程里跑 。

    也就是说, 以上两个代码都不是并行的,但是都是是并发的。

    如果当前goroutine不发生阻塞,它是不会让出CPU给其他goroutine的, 所以例子一中的输出会是一个一个goroutine进行的,而sleep函数则阻塞掉了 当前goroutine, 当前goroutine主动让其他goroutine执行, 所以形成了逻辑上的并行, 也就是并发。

    真正的并行

    为了达到真正的并行,我们需要告诉Go我们允许同时最多使用多个核。

    回到起初的例子,我们设置最大开2个原生线程, 我们需要用到runtime包(runtime包是goroutine的调度器):

    import (
        "fmt"
        "runtime"
    )
    
    var quit chan int = make(chan int)
    
    func loop() {
        for i := 0; i < 100; i++ { //为了观察,跑多些
            fmt.Printf("%d ", i)
        }
        quit <- 0
    }
    
    func main() {
        runtime.GOMAXPROCS(2) // 最多使用2个核
    
        go loop()
        go loop()
    
        for i := 0; i < 2; i++ {
            <- quit
        }
    }

    参考链接:

    https://studygolang.com/articles/1661

  • 相关阅读:
    Unique Paths II
    Subsets II
    Subsets
    Jump Game II
    Jump Game
    Valid Sudoku
    Valid Parentheses
    Length of Last Word
    Trapping Rain Water
    Sum Root to Leaf Numbers
  • 原文地址:https://www.cnblogs.com/vincenshen/p/9241669.html
Copyright © 2020-2023  润新知