`

go语言goroutine的通信机制(二)

    博客分类:
  • Go
 
阅读更多
package main
import "fmt"
/*

管道Channel是goroutine间的通讯方式,可以使用channel在多个goroutine之间传递消息

golang的并发模型是CSP,提倡通过通信共享内存,而不是通过共享内存实现通信

1.管道的类型,是引用数据类型
2.如果创建管道的时候没有指定容量,那么这个管道就是无缓冲的管道,由称为阻塞管道
3.如果管道满了,你还往管道存储数据,会报deadlock错
4.在没有使用协程的情况下,如果我们的管道数据已经全部取出,再取就会报deadlock错,

*/


func main() {
//	创建管道
	ch:= make(chan int, 3)
//	给管道里存数据
	ch<-10
	ch<-20
	ch<-30
    //从管道里取值
	a:=<- ch
	fmt.Println(a)   //10

	<-ch
	c:=<-ch
	fmt.Println(c)   //30

	fmt.Printf("值:%v 容量:%v 长度:%v\n", ch, cap(ch),len(ch))  //值:0x820238000 容量:3 长度:0



	//使用for range遍历管道,当管道被关闭的时候就会退出for range,如果没有关闭管道就会报错
	//all goroutines are asleep - deadlock!

	var ch1 = make(chan int ,10)

	for i:=1;i<=10;i++{
		ch1<-i
	}
	close(ch1)  //关闭管道

	//注意管道没有key
	for v := range ch1{
		fmt.Println(v)
	}

	//注意:通过for循环遍历管道可以不关闭管道,for range遍历必须关闭,否则报错
	var ch2 = make(chan int ,10)

	for i:=1;i<=10;i++{
		ch2<-i
	}
//	close(ch1)  //关闭管道

	
	for i:=1;i<=10;i++{
		fmt.Println(<-ch2)
	}


}
package main
import "fmt"
import "sync"
import "time"

/*
goroutine结合channel协同工作,定义两个方法,一个方法给管道写数据,一个从管道里读数据

管道是安全的:如果一个管道读取数据的速度比写入数据的速度快,读取不会报错

*/

var wg sync.WaitGroup

func fn1(ch chan int){
	for i:=1;i<=10;i++{
		ch<-i
		fmt.Printf("写入数据%v成功\n", i)
		time.Sleep(time.Millisecond*10)  //为了看出交替执行的效果
	}
	close(ch)
	wg.Done()
}


func fn2(ch chan int){
	for v := range ch{
		fmt.Printf("读取数据%v成功\n", v)
		time.Sleep(time.Millisecond*10)  //为了看出交替执行的效果
	}
	wg.Done()
}



func main() {
	var ch = make(chan int, 10)
	wg.Add(1)
	go fn2(ch)
	wg.Add(1)
	go fn1(ch)

	wg.Wait()

}

 

分享到:
评论

相关推荐

    Go语言协程goroutine和管道channel教程.PDF

    管道(channel)是Go语言中用于goroutine间通信的一种机制。它提供了一种安全的方式来在不同的goroutine之间传递数据。通过使用channel,可以有效地协调goroutine之间的数据交换,从而避免了复杂的同步问题。 #####...

    Go语言实战.pdf_go语言_Go_go_Go语言实战_

    Go语言,又称Golang,是由Google开发的一种静态类型的、编译型的、并发型的、垃圾回收的编程语言。自2009年发布以来,Go语言因其简洁、高效的语法和强大的并发处理能力,逐渐在云计算、微服务、容器等领域获得了广泛...

    go语言电子书.zip

    Go语言支持C风格的语法,同时引入了诸如goroutine(轻量级线程)和channel(通信机制)等特性,使得并发编程变得简单而高效。Go语言的垃圾回收机制则减轻了程序员管理内存的负担,增加了代码的安全性。 在《Go语言...

    韩顺平_Go语言核心编程完整版笔记.zip

    4. **并发编程**:这是Go语言的一大特色,笔记会详细解释goroutine(轻量级线程)和channel(通信机制)的概念,以及如何通过它们实现高效的并发操作。 5. **指针与内存管理**:讲解Go语言中的指针操作和内存管理,...

    Go语言学习笔记.pdf

    Go语言的goroutine和channel等概念允许开发者用极小的代码量就能编写出高度并发的程序。Go语言还提供了内置的并发安全的类型和函数,比如sync包中的Mutex、WaitGroup等,这使得在多线程环境下进行数据同步和线程间...

    go语言编程,Go语言程序设计(英文版),学习 Go 语言(Golang),golang-china读书笔记

    Go语言,也被称为Golang,是由Google开发的一种静态类型的、编译式的、并发型且具有垃圾回收功能的编程语言。自2009年发布以来,Go语言因其简洁的语法、高效的性能以及对并发编程的良好支持,受到了广大开发者的欢迎...

    Go语言技术参考手册 中文PDF版

    - Go语言采用自动内存管理和垃圾回收机制,开发者无需手动管理内存释放,提高了编程效率。 - **程序测试**: - Go语言内置了强大的测试框架,支持单元测试、基准测试等多种测试类型。 - **Web应用开发**: - ...

    Go示例学--通过示例学习Golang语言

    在这里,我们也可以看到,Go语言的goroutine和channel机制使得并发编程变得非常简单。我们可以轻松地编写高性能的并发程序,而不需要担心线程同步和死锁的问题。 因此,Go语言是一种非常适合现代网络编程和分布式...

    Go 语言源码剖析_文字版.pdf

    Go语言源码剖析的主要内容涉及Golang运行时内部执行机制的深入解析。这包括但不限于以下几个关键方面: 1. 内存分配机制:Go语言的内存分配机制是理解其性能的关键。文档中提到内存分配包含初始化、分配、回收、...

    Go语言实战_golang教程_Go_go_

    Go语言,又称Golang,是由Google开发的一种静态类型的、编译型的、并发型的、垃圾回收的、C风格的编程语言。它旨在提高编程效率,简化系统编程,并且能够支持大规模的网络服务和分布式计算。Go语言实战教程是学习Go...

    golang基础教程-go语言快速入门.zip

    Go语言,又称Golang,是Google在2009年推出的一种开源编程语言,由罗伯特·格瑞史莫、罗布·派克和肯特·贝克等大神设计。Go语言的设计目标是简单、高效、安全,特别适合构建网络服务和并发程序。它吸收了C语言的...

    Go语言介绍_ppt

    - **goroutine交互**:Go语言通过channel来实现goroutine之间的通信。通过向channel发送数据或从channel接收数据,可以实现实现goroutine间的同步和数据交换。 #### 五、错误处理机制 - **Go错误处理范式**:Go...

    Go语言学习之goroutine详解

    同时,goroutine的非抢占式调度和内置的channel通信机制,使得Go语言在并发编程中表现出色,降低了死锁和竞态条件等并发问题的出现概率。对于想要学习并发编程或者优化现有系统的开发者来说,理解和掌握goroutine是...

    go(Google)语言精要

    Go语言的显著特性包括并发机制、垃圾回收、丰富的标准库和简洁的语法。 Go语言由Rob Pike、Robert Griesemer、Ken Thompson等人设计,于2007年首次公布,并在2009年11月正式发布1.0版本。它被设计得易于学习,同时...

    Go语言四十二章经.7z

    《Go语言四十二章经》是一本深入探讨Go语言编程的资源,主要针对Go语言在服务器编程、网络编程,特别是Web应用、API应用以及分布式系统中的应用。Go语言,也称为Golang,是由Google开发的一种静态类型、编译型、并...

    Go语言TCP通信客户端和服务器端(包含代码和可执行程序)

    Go语言,又称Golang,是Google推出的一种静态类型、编译型、并发型且具有垃圾回收功能的编程语言。Go语言以其简洁的语法、高效的性能和内置的并发支持,在网络编程领域得到了广泛应用。本资料包提供了基于Go语言实现...

    Go语言编程基础(高清视频教程) .rar

    Go语言中的goroutine和channel是其并发编程的核心,goroutine轻量级线程使得大量并发执行变得轻松,而channel则提供了一种安全的数据通信机制,避免了传统多线程编程中的锁竞争问题。 本教程的"Go语言编程基础"可能...

    Go语言云动力

    Go语言,又称为Golang,是由Google开发的一种静态类型、编译型、并发型且具有垃圾回收功能的编程语言。它设计的目标是提高开发者的生产效率,同时提供高效的系统编程能力。 Go语言的特点: 1. **简洁性**:Go语言的...

Global site tag (gtag.js) - Google Analytics