golang初識2 - Go 併發

 

Go的CSP併發模型實現:M, P, G

Go實現了兩種併發形式。第一種是你們廣泛認知的:多線程共享內存。其實就是Java或者C++等語言中的多線程開發。另一種是Go語言特有的,
也是Go語言推薦的:CSP(communicating sequential processes)併發模型。 CSP併發模型是在1970年左右提出的概念,屬於比較新的概念,不一樣於傳統的多線程經過共享內存來通訊,CSP講究的是「以通訊的方式來共享內存」。 請記住下面這句話: Do not communicate by sharing memory; instead, share memory by communicating. 「不要以共享內存的方式來通訊,相反,要經過通訊來共享內存。」 普通的線程併發模型,就是像Java、C
++、或者Python,他們線程間通訊都是經過共享內存的方式來進行的。很是典型的方式就是,
在訪問共享數據(例如數組、Map、或者某個結構體或對象)的時候,經過鎖來訪問,所以,在不少時候,衍生出一種方便操做的數據結構,叫作「線程安全的數據結構」。
例如Java提供的包」java.util.concurrent」中的數據結構。

 

1. goroutine-channelhtml

(1) gojava

   go function_name...數組

(2) chan安全

    varName chan typeName數據結構

 

src:termial_factorial_chan.go多線程

package main

import (
    "fmt"
    "os"
    "strconv"
)

func main() {
    var val, x, y = 0, 0, 0
    input, err := strconv.Atoi(os.Args[1])
    if err != nil {
        fmt.Println(err)
    }
    
    ch := make(chan int)
    
    val = input

    for val > 0 {
        go factorial(val, ch)
        val--
    }
    
    for j := 0; j < input; j++ {
        x = <-ch
        y = y + x
    }
    
    fmt.Println("階乘,累加", input, "=", y)
}

func factorial(num int, ch chan int){
    ret2 := 1
    for num > 1 {
        ret2 = ret2 * num
        num--
    }
    ch <- ret2
}

 

exec:併發

go run termial_factorial_chan.go 18
相關文章
相關標籤/搜索