`

go语言三——并行

 
阅读更多

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 Web编程实战派从入门到精通》随书源码开源啦,Go语言-Web-goWebActualCombat.zip

    首先,Go语言,又称为Golang,是由Google开发的一种静态类型、编译型、并发型且具有垃圾回收功能的编程语言。它的设计目标是提高开发者的生产力和程序的运行效率,特别适合于构建高性能的网络服务和微服务架构。 在...

    大家一起学Golang——Go语言简介与安装

    大家一起学Golang ——Go语言简介与安装 go语言简介 Go语言是有google公司推出的一门编程语言,是开源,静态编程语言,语法简洁,天生支持并发。 2007年由Robert Griesemer, Rob Pike, Ken Thompson主持开发,又来...

    深入钻研Go语言dive into golang by七牛云存储许式伟

    还撰写了《Go语言编程》一书,并翻译了《Programming in Go》,并且许式伟还参与了盛大网盘以及盛大云存储前身项目——盛大祥云计划的发起工作,因此他在Go语言方面的知识和见解颇为深刻。 在介绍中,许式伟提出了...

    Go语言游戏服务器框架【Leaf Server】

    【Go语言游戏服务器框架——Leaf Server深度解析】 Go语言,以其高效的并发模型、简洁的语法以及优秀的内存管理,已经成为构建高性能网络服务的首选语言之一。在游戏开发领域,尤其是服务器端,Go语言的优势更是...

    基于golang go语言的冬奥会数据可视化与奖牌预测系统.zip

    《基于Go语言的冬奥会数据可视化与奖牌预测系统——深入解析与实践》 Go语言,又称Golang,是由Google公司开发的一种静态类型的、编译型的、并发型且具有垃圾回收功能的编程语言。在本项目中,"基于Go语言的冬奥会...

    Go语言练习(贪吃蛇案例)

    在本主题"Go语言练习(贪吃蛇案例)"中,我们将深入探讨如何使用Go语言实现一个经典的计算机游戏——贪吃蛇。这个练习旨在帮助已经掌握一定Go编程基础的开发者进一步提升技能,通过实际项目的演练来巩固理论知识。下面...

    Go-什么车最适合跑滴滴——数据化思维小记

    Go语言,也被称为Golang,是由Google设计的一种静态类型、编译型的编程语言。它以其简洁的语法、高效的性能和内置并发支持而受到开发者们的欢迎,尤其适合于构建网络服务和处理大规模数据的应用场景。在滴滴出行这样...

    学习go语言

    2. **Go的并发模型**:Go语言的一大亮点是其内置的并发原语——goroutine和channel。Goroutine是一种轻量级线程,可以高效地实现多任务并行执行。Channel则用于在goroutine之间安全地传递数据,构建出通信顺序进程...

    Go语言_web_编程.pdf

    Go 语言,也被称为 Golang,是由 Google 设计的一种现代化的编程语言,旨在解决软件构建中的效率、并发性、安全性和可维护性问题。Go 语言以其高效的性能、简洁的语法和内置的并发支持而受到广泛关注,特别适用于...

    基于Go语言实现的论文评价系统源码

    Go的并发模型——goroutines和channels,使得系统可以并行处理多个评审任务,提高了系统的响应速度和处理能力。 在系统架构上,通常采用微服务设计模式,每个服务专注于特定的业务功能,如用户管理、论文提交、评审...

    go语言分布式书籍合集

    3. **Go语言在对象存储中的应用**:Go语言的并发特性使得其在处理大规模数据传输和存储时表现出色,书中可能会介绍如何使用Go的goroutine和channel实现数据的并行处理和传输。 4. **一致性哈希与数据分片**:分布式...

    Golang之美ppt

    ### Golang之美——深入探索Go语言的独特魅力 #### Golang的哲学 1. **背景介绍**:Go语言是由Google在2009年推出的第二代开源编程语言,它旨在为多处理器系统的应用程序提供高效的编程解决方案。Go语言编译出的...

    tao-1.6.0.zip_Go_ Go_ Go!_go语言 tcp_tao.16_tcp

    《Go语言实现的TCP异步框架——Tao详解》 在现代互联网开发中,高效的网络通信框架对于构建高性能服务至关重要。Tao,一个基于Go语言的轻量级TCP异步框架,以其简洁的设计和强大的功能,成为了开发者们关注的焦点。...

    用英文写一篇短文介绍计算机语言的发展历史和特点,要求简单介绍机器语言、汇编语言、高级语言的简单发展历程和各自的特点。

    首先,我们回到计算机语言的最早阶段——机器语言。在20世纪40年代,计算机刚刚起步,那时的计算机只能理解和执行由二进制代码(0和1)组成的指令,这就是机器语言。这些指令直接对应于硬件的操作,每一串二进制码都...

    Go-golang实现单机支持100万用户

    在IT行业中,Go语言(Golang)以其高效、并发能力强和内存管理优秀的特点,成为构建高性能服务的理想选择。本文将深入探讨如何使用Go语言来实现单机支持百万用户,并模拟2015年微信红包的高QPS(每秒查询率)场景。 ...

Global site tag (gtag.js) - Google Analytics