EpollfdTimer
基于linux timerfd实现的定时器模块. 使用Epoll来监听调度timerfd.
timerfd
timerfd是Linux为用户程序提供的一个定时器接口。这个接口基于文件描述符,通过文件描述符的可读事件进行超时通知,一般是被用于select/poll/epoll的应用场景。
我们的timerfd_create()把时间变成了一个文件描述符,该文件描述符会在超时时变得可读,这种特性可以使我们在写服务器程序时,很方便的便把定时事件变成和其他I/O事件一样的处理方式,并且此定时接口的精度也足够的高,所以我们只要以后在写I/O框架时用到了定时器就该首选
timerfd 与 select timeout 区别
- timerfd_create 把时间变成了一个文件描述符,该“文件”在定时器超时的那一刻变得可读,这样就能很方便地融入到 select/poll 框架中,用统一的方式来处理 IO 事件和超时事件。
- 利用select, poll的timeout实现定时功能,它们的缺点是定时精度只有毫秒,远低于 timerfd_settime 的定时精度。
timerfd C API 使用方法
主要是三个函数接口
|
|
timerfd_create
|
|
它是用来创建一个定时器描述符timerfd
clockid
指定时间类型,有两个值:
CLOCK_REALTIME :Systemwide realtime clock. 系统范围内的实时时钟
CLOCK_MONOTONIC:以固定的速率运行,从不进行调整和复位 ,它不受任何系统time-of-day时钟修改的影响
flags
可以是0或者O_CLOEXEC/O_NONBLOCK。
return
timerfd(文件描述符)
timerfd_settime
|
|
用于启动和停止定时器,fd为timerfd_create获得的定时器文件描述符,flags为0表示是相对定时器,为TFD_TIMER_ABSTIME表示是绝对定时器。const struct itimerspec *new_value表示设置超时的时间。
此函数用于设置新的超时时间,并开始计时。
ufd
timerfd_create返回的文件句柄。
flags
为1代表设置的是绝对时间;为0代表相对时间。
struct itimerspec * utmr
|
|
为需要设置的时间。
struct itimerspec * otmr
|
|
it_interval是后续周期性超时时间,是多少时间就填写多少。
it_interval不为0则表示是周期性定时器,大于0,是周期性的时间。
it_value 是首次超时时间,需要填写从clock_gettime获取的时间,并加上要超时的时间。
it_value和it_interval都为0表示停止定时器。
为定时器这次设置之前的超时时间。
return
一般来说函数返回0代表设置成功。
timerfd_gettime
|
|
此函数用于获得定时器距离下次超时还剩下的时间。如果调用时定时器已经到期,并且该定时器处于循环模式(设置超时时间时struct itimerspec::it_interval不为0),那么调用此函数之后定时器重新开始计时
timerfd 的例子
linux timerfd api中给出的例子:
|
|
timerfd + epoll 的例子
|
|
python 实现
参照linux timerfd api,用PyObject封装了timerfd的c api, 因为python标准库里不存在timerfd定时接口