【go】gopl学习笔记(5.goroutine & channel)

本文是关于Go语言并发编程的学习笔记,重点介绍了goroutine和channel的使用。从goroutine的交互体验和服务器并发处理,到channel的无缓存、有缓存、单向、同步与异步通信等特性,以及select多路复用和goroutine的退出策略,深入探讨了Go语言的并发控制和通信机制。
摘要由CSDN通过智能技术生成

目录

前言

1.goroutine

1.1 交互体验

1.2 服务端

2.Channels

2.0 最简易用法:

2.1 无缓存channel & 同步

2.2 串联的Channels(pipeline)

2.3 单向channel

2.4 带缓存buffer的Channel

2.5 并发的循环

2.6 join等待

2.6.1 计数sync.WaitGroup

2.6.2 chennel信号量

2.7 select多路复用

2.8 goroutine退出


前言

应用程序通常需要

  1. 图形化界面异步执行一部分代码,以提升交互体验
  2. 需要并发地执行以提升效率
  3. 服务端并发处理连接,提升响应速度和qps

这些功能都是通过并发实现地,在Go语言中,每一个并发的执行单元叫作一个goroutine,可以暂时理解为Java地线程Thread。语法非常简单,就是在调用需要异步执行的方法前加上go关键字:

f()    // call f(); 同步调用,等待返回
go f() // 创建 goroutine调用f(); 不等待结果,当前goroutine继续执行下面地代码

1.goroutine

1.1 交互体验

当程序在做复杂性高的工作,用户等待在那里得不到响应,用户体验非常差,所以我们通常看到有很多应用会展示进度条或者一朵菊花似的圈圈在那转(如图),以提示用户等待⌛️。

下面是一个最简单的样例,在执行fib斐波那契数列计算时,并发地打印等待的圈圈spinner。两个独立执行单元分别在独立的函数中,但两个函数会并发地执行(cpu多核的情况可以同时执行,非多核是两个单元轮流执行一个时间片)。

func main() {
	go spinner(100 * time.Millisecond)		// 并发执行函数spinner
	const n = 45
	fibN := fib(n) // slow 递归深度大,执行效率低
	fmt.Printf("\rFibonacci(%d) = %d\n", n, fibN)
}

执行结果:一直旋转,直到fib返回 主函数main也执行结束,主函数返回时,所有的goroutine都会被直接打断,程序退出。除了从主函数退出或者直接终止程序之外,没有其它的编程方法能够让一个goroutine来打断另一个的执行,但可以通过goroutine之间的通信来让一个goroutine A 请求goroutine B,并让goroutine B自行结束执行。

1.2 服务端

一个TCP服务端如果只能同步执行,那一次只能处理一个请求,执行结果如下,第一个客户端连接,能后拿到响应;第二个客户端连接了

// TCP 服务端
func main() {
	listener, err := net.Listen("tcp", "localhost:8000")
	if err != nil {
		log.Fatal(err)
	}
	for {
		conn, err := listener.Accept()		// 监听连接,有连接进来返回一个连接
		if err != nil {
			log.Print(err) // e.g., connection aborted
			continue
		}
		handleConn(conn) // 一次只能处理一个连接,一直等到这个函数返回,才能下个循环响应下一个连接
	}
}
// 返回给客户端当前时间,死循环,一直不能退出
func handleConn(c net.Conn) {
	defer c.Close()
	for {
		_, err := io.WriteString(c, time.Now().Format("15:04:05\n"))
		if err != nil {
			return // e.g., client disconnected
		}
		time.Sleep(1 * time.Second)
	}
}
client1 client2
</
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值