Golang✔️走进 Go 语言✔️ 第十六课 协程 & 通道
Posted 我是小白呀
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Golang✔️走进 Go 语言✔️ 第十六课 协程 & 通道相关的知识,希望对你有一定的参考价值。
概述
Golang 是一个跨平台的新生编程语言. 今天小白就带大家一起携手走进 Golang 的世界. (第 16 课)
协程
协程 (Coroutine) 是一种基于线程之上, 但又比线程更加轻量级的存在. 一个进程可以拥有多个线程, 一个线程也可以拥有多个协程. 协程拥有高并发, 高 I/O, 低计算.
并发 vs 并行
并发:
- 将 CPU 运行时间划分成若干个时间段, 一个时间段内只运行一个线程, 其他线程处于挂起状态
并行:
- 一个 CPU 在执行一个线程的时候, 另一个 CPU 在执行另一个线程, 两个线程同时运行.
进程 vs 线程 vs 协程
进程:
- 一个进程好比是一个程序, 是资源分配的最小单位.
线程:
- 一个线程好比是一个任务, 是程序执行过程中的最小单元
协程:
- 轻量级的线程, 高并发, 高扩展性, 低成本
协程并发
package main
import (
"fmt"
"time"
)
func main() {
// 协程并发
go helloword("222")
go helloword("333")
// 函数调用
helloword("111")
}
func helloword(str string) {
for i := 0; i < 5; i++ {
time.Sleep(100 * time.Millisecond)
fmt.Println(str)
}
}
输出结果:
222
111
333
333
222
111
222
111
333
111
222
333
222
111
我们可以看到输出没有固定先后顺序.
不适用并发:
通道
Go 语言中的通道 (Channel) 是一种特殊的类型. 在任何时候, 同时只能有一个 goroutine 访问通道进行发送和获取数据. 通道就像一个队列, 遵循啊先入先出的原则, 保证收发数据的顺序.
创建通道
格式:
通道实例 := make(chan 数据类型)
- 数据类型: 通道内传输的元素类型
- 通道实例: 通过 make 创建的通道句柄
例子:
package main
import "fmt"
func main() {
// 创建整数通道
var channel = make(chan string)
// 发送数据给通道
go func() {channel <- "message"}()
// 定义字符串变量
msg := <- channel
// 调试输出
fmt.Print(msg)
}
输出结果:
message
通道同步
例子:
package main
import "fmt"
func send_msg(send chan string, msg string) {
send <- msg
}
func receive_msg(send chan string, receive chan string) {
receive <- <-send
}
func main() {
// 创建通道
var send = make(chan string)
var receive = make(chan string)
// 协程
go send_msg(send, "message")
go receive_msg(send, receive)
// 调试输出
fmt.Println(<-receive)
}
输出结果:
message
以上是关于Golang✔️走进 Go 语言✔️ 第十六课 协程 & 通道的主要内容,如果未能解决你的问题,请参考以下文章