SRS的定时器模块SrsFastTimer—SRS源码分析
作者:罗上文,微信:Loken1,公众号:FFmpeg弦外之音
SRS 的定时器是 SrsFastTimer
,它跟 SrsSignalManager
类似,也是继承的 ISrsCoroutineHandler
,所以他也是一个 Handler
。
SrsFastTimer
也有一个 trd_
字段来代表 协程实例,不过他这里的命名我觉得有点不规范,在 SrsSignalManager
明明用的是 trd
,这里又是 trd_
,多了一个下划线 _
后缀。
上图的 interval_
是间隔的意思,就是定时器每隔多久运行一次。
整个套路跟以前的模块都是比较类似的,因为定时器是共用的协程,多个功能同时用一个定时器协程的,所以他用 subscribe
订阅加到 handlers
这个 vector
里面执行各自功能模块的 on_timer()
定时器事件。如下:
上图有两个地方不太容易看懂。
1,trd_->pull()
pull()
的实现在 SrsFastCoroutine
的头文件里面,实际上就是判断一下协程有没发生错误。如下:
inline srs_error_t pull() {
if (trd_err == srs_success) {
return srs_success;
}
return srs_error_copy(trd_err);
}
2,++_srs_pps_timer->sugar
我暂时也没看到这个统计是做什么用的,后面补充。
在 SrsHybridServer
里面一共有 4 个定时器实例,也就是有 4 个定时器协程,如下:
这些定时器分别是 20ms,100ms,1s,5s 运行一次。外部的模块想订阅定时器,需要继承 ISrsFastTimer
,然后实现 on_timer()
方法,然后用 subscribe
来订阅对应的定时器。
例如 之前的熔断模块 SrsCircuitBreaker
就是每隔 1 秒检测一下 CPU 使用率,所以他 subscribe
订阅了 timer1s_
定时器,如下:
_srs_hybrid->timer1s()->subscribe(this);
SRS 里面一共有 9 个 on_timer()
定时器任务,如下: