gofr操作的相关关键字
¶一、代码中关键关键字 / 组件的作用详解
以下是基于 GoFrame 并发代码中核心关键字和组件的详细说明,结合代码场景解释其作用:
¶1. 协程与并发基础
-
goGo 语言的协程启动关键字,用于创建轻量级线程(goroutine)。
在代码中,
1
go worker(...)
1
go resultProcessor(...)
等语句启动了多个并行执行的协程,实现任务的并发处理。
相比操作系统线程,协程由 Go runtime 管理,内存占用极低(初始栈仅 2KB),可同时启动数万级协程。
¶2. 通道(数据通信)
- **
chan**用于协程间安全通信的数据结构,实现 “通过通信共享内存,而非通过共享内存通信”。- 代码中
taskChan := make(chan DataTask, 100)创建了带缓冲的通道,缓冲大小 100 表示最多可暂存 100 个任务,避免协程阻塞。 - 方向限定符
<-chan(只读)和chan<-(只写)用于限制通道操作权限,增强代码安全性(如worker函数的taskChan <-chan DataTask表示只能从该通道接收数据)。
- 代码中
- 通道操作
<-- 发送:
taskChan <- task将任务写入通道,供工作协程读取; - 接收:
task, ok := <-taskChan从通道读取任务,ok用于判断通道是否已关闭。
- 发送:
¶3. 同步与等待
-
sync.WaitGroup用于等待一组协程完成的同步工具,核心方法:
-
wg.Add(1):注册一个待完成的协程; -
wg.Done():通知 WaitGroup 某个协程已完成(通常在defer中调用); -
wg.Wait()Done()1
2
3
阻塞当前协程,直到所有注册的协程都调用sync.WaitGroup1
2
3
在代码中,监听取消信号,当上下文被取消(如程序退出)时,所有依赖该上下文的协程可及时退出。 在代码中,1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
用于等待所有工作协程处理完任务后再退出程序。
#### 4. 资源管理与清理
- `defer`
用于延迟执行函数调用,确保在当前函数退出时(无论正常返回还是 panic)执行清理逻辑。
- 代码中 `defer wg.Done()` 确保工作协程退出前通知 WaitGroup;
- `defer ticker.Stop()` 确保定时器在结果处理器退出时停止,避免资源泄漏。
#### 5. 上下文与退出控制
- `context.Context`
用于传递请求生命周期的上下文信息(如超时、取消信号),实现协程间的优雅退出。
- `ctx := gctx.New()` 创建基础上下文;
- ```
<-ctx.Done()语句结合1
select
实现了协程的安全退出逻辑。1
case <-ctx.Done()
-
¶6. 流程控制
-
select用于同时监听多个通道操作,当其中一个通道可操作时执行对应逻辑,常用于协程中的多条件等待。
代码中
1
select
结合通道接收和
1
ctx.Done()
实现了 “要么处理任务,要么响应退出信号” 的逻辑。
¶7. GoFrame 框架组件
-
gtimerGoFrame 的定时器组件,用于周期性执行任务。代码中
1
gtimer.New(...)
定期输出任务处理进度。
-
g.LogGoFrame 的日志组件,用于并发安全的日志输出,避免多协程打印日志时的混乱。
¶代码示例:
1 | package main |