golang初识2

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-channel

(1) go

   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
原文地址:https://www.cnblogs.com/xiaobin-hlj80/p/10672813.html