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