No.13 golang中channel(管道)常见使用场景?(下)

简介: No.13 golang中channel(管道)常见使用场景?

3. 事件通知管道可以用于在不同goroutine之间发送事件通知,例如当某个条件满足时,可以通过管道发送通知,让其他goroutine进行相应的处理。示例代码如下:

640.png

Tips:在这个例子中,我们创建了一个布尔类型的管道done,并将其传递给worker函数。worker函数中,我们执行了一些任务,并在任务完成后向管道中发送了一个布尔类型的值true,表示任务已完成。在main函数中,我们等待从管道中接收到通知,表示任务已完成,然后打印输出任务完成的信息。

需要注意的是,在这个例子中,我们使用了阻塞式的管道操作,即在接收通知前,程序会一直阻塞在<-done这一行代码处,直到接收到通知后才会继续执行。



4. 信号量控制管道可以用于控制并发访问资源的数量,例如通过管道限制同时访问某个资源的goroutine数量,避免资源竞争和死锁。示例代码如下:

640.png

Tips:在这个例子中,我们创建了两个整数类型的管道jobsresults,分别用于存储任务和处理结果。在main函数中,我们启动了三个goroutine,分别处理任务。在worker函数中,我们从jobs管道中接收任务,进行处理,并将处理结果发送到results管道中。在main函数中,我们向jobs管道中发送了100个任务,并关闭了jobs管道,表示任务已经全部发送完毕。然后,我们从results管道中接收处理结果,并打印输出。

需要注意的是,在这个例子中,我们使用了带缓冲的管道,即在创建管道时,指定了管道的容量。这样可以避免在发送和接收数据时出现阻塞,提高了程序的并发性能


5. 数据流处理管道可以用于处理数据流,例如将数据从一个输入管道读取,经过处理后发送到一个输出管道,实现数据的流式处理。需要注意的是,管道的使用需要注意避免死锁和竞争等问题,可以使用Go语言提供的select语句和互斥锁等机制来保证管道的正确使用。同时,管道的使用也需要根据具体的场景进行优化和调整,以提高程序的性能和可读性。示例代码如下:

640.jpg

在这个例子中,我们创建了一个字符串类型的管道ch,并将其传递给两个goroutine。在第一个goroutine中,我们使用bufio包中的Scanner类型从标准输入中读取数据,并将其发送到管道中。在第二个goroutine中,我们从管道中接收数据,并将其转换为大写字母形式,然后打印输出。main函数中,我们使用select{}语句等待程序结束。

需要注意的是,在这个例子中,我们使用了非阻塞式的管道操作,即在发送数据前,我们没有使用ch <- msg这一行代码进行阻塞,而是直接将数据发送到管道中。同样地,在接收数据前,我们也没有使用msg := <-ch这一行代码进行阻塞,而是使用了for{}循环,不断地从管道中接收数据。这种方式可以实现数据的流式处理,避免了阻塞和等待,提高了程序的并发性能和可读性。

相关文章
|
6月前
|
Go 调度
浅谈Golang通道channel
浅谈Golang通道channel
68 0
|
存储 编译器 Go
Golang 语言的多种变量声明方式和使用场景
Golang 语言的多种变量声明方式和使用场景
64 0
|
安全 Go
Golang 语言使用 channel 并发编程
Golang 语言使用 channel 并发编程
49 0
|
安全 Go 索引
Golang 语言中的 channel 实现原理
Golang 语言中的 channel 实现原理
60 0
|
消息中间件 缓存 Go
Golang 语言中 Channel 的使用方式
Golang 语言中 Channel 的使用方式
47 0
|
2月前
|
Go
Golang语言之管道channel快速入门篇
这篇文章是关于Go语言中管道(channel)的快速入门教程,涵盖了管道的基本使用、有缓冲和无缓冲管道的区别、管道的关闭、遍历、协程和管道的协同工作、单向通道的使用以及select多路复用的详细案例和解释。
93 4
Golang语言之管道channel快速入门篇
|
16天前
|
中间件 Go 数据处理
应用golang的管道-过滤器架构风格
【10月更文挑战第1天】本文介绍了一种面向数据流的软件架构设计模式——管道-过滤器(Pipe and Filter),并通过Go语言的Gin框架实现了一个Web应用示例。该模式通过将数据处理流程分解为一系列独立的组件(过滤器),并利用管道连接这些组件,实现了模块化、可扩展性和高效的分布式处理。文中详细讲解了Gin框架的基本使用、中间件的应用以及性能优化方法,展示了如何构建高性能的Web服务。
41 0
|
6月前
|
程序员 Go 调度
第十六章 Golang中goroutine和channel
第十六章 Golang中goroutine和channel
48 3
|
6月前
|
存储 算法 Java
Golang底层原理剖析之多路select、channel数据结构和阻塞与非阻塞
Golang底层原理剖析之多路select、channel数据结构和阻塞与非阻塞
75 0
|
6月前
|
Go
用golang实现一个基于interface的多态示例,展示其使用场景和优劣性。
用golang实现一个基于interface的多态示例,展示其使用场景和优劣性。
158 0