设计目的
研发过程和实际使用中发现golang中开启协程很容易,但是管理起来很麻烦,无法有效检测协程内容运行情况,协程崩溃,协程使用的chan阻塞情况,并且无限制增长的协程会为程序带来风险
经过之前讨论golang的协程需要管理的要点,总结为以下几点:
1. 每个协程需要有唯一的命名
2. 定时输出每个协程使用的chan的使用情况,并且确认数据是在流动的
3. 除特殊协程外(玩家链接协程属于特殊协程),协程必须要有合适的崩溃捕捉,在其崩溃后能够迅速恢复
4. 定时对协程的运行情况进行采集,对于有风险的协程及时发出告警
5. 能够通过日志有效追溯协程出现问题的原因
设计思路
为协程抽象一个接口和一个统一管理器,所有协程都需要实现统一接口和委托管理器来进行管理。达到统一实现以上设计目的
管理器设计:
1. 管理器需要在协程被加入管理器时启动协程
2. 管理器需要在协程被移除管理器时停止协程
3. 管理器需要为协程进行唯一编号,方便协程打印状态时区分
4. 管理器需要保证停止时统一安全停止所有协程
5. 管理器需要保证协程异常停止时打印堆栈信息
6. 管理器需要保证协程异常停止时,有重新拉起协程的能力
协程接口设计:
1. 需要实现协程运行的主逻辑
2. 需要有打印运行状态的接口
3. 需要在协程退出时进行析构
设计说明
管理器添加协程方法,协程添加进管理器后启动协程
func (manager *ThreadManager) StartThread(thread Thread)
管理器移除协程方法,协程从管理器中移除协程时需要同时停止协程
func (manager *ThreadManager) StartThread(thread Thread)
管理器提供了统一创建协程基类的方法,为管理的协程统一进行编号
func (manager *ThreadManager) NewBas
如何保证golang的协程可控-协程管理器
最新推荐文章于 2024-05-25 21:40:00 发布
本文介绍了如何设计一个Golang协程管理器来确保协程的可控性,包括唯一命名、运行状态监控、异常捕获与恢复、风险预警以及日志追溯。通过管理器和统一的协程接口,可以实现协程的生命周期管理和异常处理,从而提高程序的稳定性和可维护性。
摘要由CSDN通过智能技术生成