golang初识4 - 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-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 = , ,
input, err := strconv.Atoi(os.Args[])
if err != nil {
fmt.Println(err)
} ch := make(chan int) val = input for val > {
go factorial(val, ch)
val--
} for j := ; j < input; j++ {
x = <-ch
y = y + x
} fmt.Println("阶乘,累加", input, "=", y)
} func factorial(num int, ch chan int){
ret2 :=
for num > {
ret2 = ret2 * num
num--
}
ch <- ret2
}
exec:
go run termial_factorial_chan.go
golang初识4 - Go 并发的更多相关文章
- Golang 高效实践之并发实践
前言 在我前面一篇文章Golang受欢迎的原因中已经提到,Golang是在语言层面(runtime)就支持了并发模型.那么作为编程人员,我们在实践Golang的并发编程时,又有什么需要注意的点呢?下面 ...
- Golang 高效实践之并发实践context篇
前言 在上篇Golang高效实践之并发实践channel篇中我给大家介绍了Golang并发模型,详细的介绍了channel的用法,和用select管理channel.比如说我们可以用channel来控 ...
- golang网络编程高并发
1 golang写服务器不需要epoll吗 golang写服务器不需要在用reactor模式的epoll了,因为golang的协程非常廉价,可以并发开启成千上完个协程. 一个协程占用内存大概2KB左右 ...
- golang学习笔记 ---面向并发的内存模型
Go语言是基于消息并发模型的集大成者,它将基于CSP模型的并发编程内置到了语言中,通过一个go关键字就可以轻易地启动一个Goroutine,与Erlang不同的是Go语言的Goroutine之间是共享 ...
- golang初识 和 变量,常量,iota
目录 一.go语言与python 1. go语言 2. python 二.变量相关 1. go语言的基本语法 2. 标识符和关键字 3. 变量声明 (1)声明变量时未指定初始值 (2)声明变量时指定初 ...
- Golang语言系列-11-goroutine并发
goroutine 并发 概念 package main import ( "fmt" "time" ) /* [Go语言中的并发编程 goroutine] [ ...
- golang初识5 - interface
1. interface-new (1) abstract format: type abstractName interface { method_name1 [return_type] } (2) ...
- golang初识3 - func
1. 功能块(function block) 格式: func function_name( [parameter list] ) [return_types] { //body } 与delphi的 ...
- golang初识2
1. 赋值与申明 str := "Hello, WebAssembly" // 简短声明 标准格式: var str string str = "Hello, WebAs ...
随机推荐
- c#枚举描述
1.枚举遍历 public enum e_Sex{ male=, female= } foreach (var value in Enum.GetValues(typeof(e_Sex)){ /* 获 ...
- JavaSE-运算符和流程控制
一.运算符 1.算术运算符: (1) 进行混合运算的时候:byte,short,char之间不会相互转换,都会自动提升为int类型 .其他类型进行混合运算的时候都是小的数据类型提升为大的:byte,s ...
- ArcGIS中的坐标系:基本概念和常用操作(一)
本文呢是主要是借鉴李郎平李大大的博士论文和百度百科,里面还有一点点我自己的理解,希望能帮助自己加深对于坐标系的认识. 李大大的博客:http://blog.sciencenet.cn/u/Brume ...
- 同时兼容ie8 与ie11
最近公司发文规定说程序要必须同时兼容ie8与ie11 下面是在修改程序时遇到的一些问题. 1:new Date 获取年的问题,在ie8及以下ie以下版本是可以用getYear()方法来获取年得到的数值 ...
- Hibernate5.3 + mysql8.0遇到的问题
今天学习Hibernate看的是旧版本的视频Hibernate4.0版本 遇到几个新旧版本的区别. 1.方言,这个是因为SQL不是因为Hibernate 新版方言 2.将编译的类配置进congifur ...
- Scrum学习心得
一.Scrum学习心得: 最近简单的学习了一下scrum模式,感觉又开启了一个新世界的大门. 首先,scrum是一个应用于互联网研发的开发方式,这种开发方式的主要特点是快速迭代,持续交付. scrum ...
- CentOS7下MySQL5.7安装配置方法图文教程(YUM)
安装环境:CentOS7 64位,MySQL5.7 1.配置YUM源 在MySQL官网中下载YUM源rpm安装包:http://dev.mysql.com/downloads/repo/yum/ # ...
- JVM运行时数据区域
上面已经聊过JVM是什么东东,也谈过了JVM内存的垃圾回收机制.这一篇博客我们来聊聊JVM运行时数据区域. JVM运行时数据区域由5块部分组成,分别是堆,方法区,栈,本地方法栈,以及程序计数器组成. ...
- 2019OO第二单元作业总结
OO第二单元的作业主题是模拟电梯. ---------------------------------------------------------------------------------- ...
- 14. Encryption tools (加密工具 8个)
SSH(Secure Shell)现在是无处不在的程序,用于在远程机器上登录或执行命令. 它通过不安全的网络在两个不受信任的主机之间提供安全的加密通信,取代了可怕的不安全的telnet / rlogi ...