go从语言层面就支持并行程序设计
goroutine(Go语言并行设计的核心),比thread高效易用
package main import( "fmt" "runtime" ) func say(word string){ for i:=0; i<10; i++ { // runtime.Gosched() //让出时间片 fmt.Println(word) } } func main(){ //默认系统线程数量为1,可通过下面指令调整,充分利用多核优势 runtime.GOMAXPROCS(4) go say("Hello") say("World") }
多个 goroutine 运行在同一个进程里面,共享内存数据,不过设计上我们要遵循:不要通过共享来通信,而要通过通信来共享
go提供了channel作为数据通信,类似unix下的管道,需要用make定义通信数据类型
package main import( "fmt" "runtime" ) //send函数读取channel时不会读取到自己发送到channel的数据 func send(name string,c chan string){ w := "Hello " + name //send message w to channel c c <- w //recv message from c w = <- c fmt.Printf("A Got %v from recv\n",w) } func recv(c chan string){ //recv message from c w := <- c fmt.Printf("B Got %v from send\n",w) //send message to c c <- "OK." } func main(){ runtime.GOMAXPROCS(4) c := make(chan string) go send("B",c) //go recv(c) res := "" fmt.Scan(&res) }
channel 接收和发送数据都是阻塞的,除非另一端已经准备好,这样就使得Goroutines 同步变的更加的简单,而不需要显式的 lock。
有缓冲的channel
ch := make(chan type, value)
value == 0 ! 无缓冲(阻塞)
value > 0 ! 缓冲(非阻塞,直到 value 个元素)
生产者通过关键字 close 函数关闭 channel,关闭channel 之后就无法再发送任何数据了,在消费方可以通过语法 v, ok := <-ch 测试 channel是否被关闭。如果 ok 返回 false,那么说明 channel 已经没有任何数据并且已经被关闭。
通过select在多个channel之间随机选择一个处理
package main import( "fmt" ) func main(){ chan_a := make(chan string) chan_b := make(chan string) chan_quit := make(chan string) go func() { //从chan_a通道接收数据五次,然后发送quit命令 for i:=0;i<5;i++ { fmt.Println("Listen on chan_a",<-chan_a) } chan_quit <- "quit" }() go func() { //同上 for i:=0;i<5;i++ { fmt.Println("Listen on chan_b",<-chan_b) } chan_quit <- "quit" }() for { select { case chan_a <- "hello_a"://chan_a通道可写 fmt.Println("Send hello_a to chan_a") case chan_b <- "hello_b"://chan_b通道可写 fmt.Println("Send hello_b to chan_b") case <- chan_quit://chan_quit通道可读 fmt.Println("Quit") return //case <- time.After(5 * time.Second): //设置超时 //default: //当所有channel都阻塞时调用默认代码 } } }
相关推荐
首先,Go语言,又称为Golang,是由Google开发的一种静态类型、编译型、并发型且具有垃圾回收功能的编程语言。它的设计目标是提高开发者的生产力和程序的运行效率,特别适合于构建高性能的网络服务和微服务架构。 在...
大家一起学Golang ——Go语言简介与安装 go语言简介 Go语言是有google公司推出的一门编程语言,是开源,静态编程语言,语法简洁,天生支持并发。 2007年由Robert Griesemer, Rob Pike, Ken Thompson主持开发,又来...
还撰写了《Go语言编程》一书,并翻译了《Programming in Go》,并且许式伟还参与了盛大网盘以及盛大云存储前身项目——盛大祥云计划的发起工作,因此他在Go语言方面的知识和见解颇为深刻。 在介绍中,许式伟提出了...
【Go语言游戏服务器框架——Leaf Server深度解析】 Go语言,以其高效的并发模型、简洁的语法以及优秀的内存管理,已经成为构建高性能网络服务的首选语言之一。在游戏开发领域,尤其是服务器端,Go语言的优势更是...
《基于Go语言的冬奥会数据可视化与奖牌预测系统——深入解析与实践》 Go语言,又称Golang,是由Google公司开发的一种静态类型的、编译型的、并发型且具有垃圾回收功能的编程语言。在本项目中,"基于Go语言的冬奥会...
在本主题"Go语言练习(贪吃蛇案例)"中,我们将深入探讨如何使用Go语言实现一个经典的计算机游戏——贪吃蛇。这个练习旨在帮助已经掌握一定Go编程基础的开发者进一步提升技能,通过实际项目的演练来巩固理论知识。下面...
Go语言,也被称为Golang,是由Google设计的一种静态类型、编译型的编程语言。它以其简洁的语法、高效的性能和内置并发支持而受到开发者们的欢迎,尤其适合于构建网络服务和处理大规模数据的应用场景。在滴滴出行这样...
2. **Go的并发模型**:Go语言的一大亮点是其内置的并发原语——goroutine和channel。Goroutine是一种轻量级线程,可以高效地实现多任务并行执行。Channel则用于在goroutine之间安全地传递数据,构建出通信顺序进程...
Go 语言,也被称为 Golang,是由 Google 设计的一种现代化的编程语言,旨在解决软件构建中的效率、并发性、安全性和可维护性问题。Go 语言以其高效的性能、简洁的语法和内置的并发支持而受到广泛关注,特别适用于...
Go的并发模型——goroutines和channels,使得系统可以并行处理多个评审任务,提高了系统的响应速度和处理能力。 在系统架构上,通常采用微服务设计模式,每个服务专注于特定的业务功能,如用户管理、论文提交、评审...
3. **Go语言在对象存储中的应用**:Go语言的并发特性使得其在处理大规模数据传输和存储时表现出色,书中可能会介绍如何使用Go的goroutine和channel实现数据的并行处理和传输。 4. **一致性哈希与数据分片**:分布式...
### Golang之美——深入探索Go语言的独特魅力 #### Golang的哲学 1. **背景介绍**:Go语言是由Google在2009年推出的第二代开源编程语言,它旨在为多处理器系统的应用程序提供高效的编程解决方案。Go语言编译出的...
《Go语言实现的TCP异步框架——Tao详解》 在现代互联网开发中,高效的网络通信框架对于构建高性能服务至关重要。Tao,一个基于Go语言的轻量级TCP异步框架,以其简洁的设计和强大的功能,成为了开发者们关注的焦点。...
首先,我们回到计算机语言的最早阶段——机器语言。在20世纪40年代,计算机刚刚起步,那时的计算机只能理解和执行由二进制代码(0和1)组成的指令,这就是机器语言。这些指令直接对应于硬件的操作,每一串二进制码都...
在IT行业中,Go语言(Golang)以其高效、并发能力强和内存管理优秀的特点,成为构建高性能服务的理想选择。本文将深入探讨如何使用Go语言来实现单机支持百万用户,并模拟2015年微信红包的高QPS(每秒查询率)场景。 ...