libev提供了ev_idle_set机制
当年在libevent里想了好多办法,修改了其内部机制才实现。现在看起来还是libev比较体贴,直接在api提供了这个功能。
libUV在上一层又封装了一下,更方便使用
例:
static uv_idle_t idle_handle;
uv_prepare_t uv_prepare_sleep;
uv_loop_t* uvloop;
static void idle_cb(uv_idle_t* handle, int status)
{
static int idle_cb_called = 0;
idle_cb_called++;
printf("idle_cb %d\n", idle_cb_called);
}
main()
{
...
uvloop = uv_default_loop();
uv_prepare_init(uvloop, &uv_prepare_sleep);
int r = uv_idle_init(uv_default_loop(), &idle_handle);
r = uv_idle_start(&idle_handle, idle_cb);
uv_run(uvloop);
}
一般情况下,epoll有事件来的时候,会触发相应的事件。但是程序在等待事件的空闲时间可以做很多事情,如果用的好的话,完全可以避免到处加锁。比如小型IM的server,需要定时检查用户在线状态,一般直接的想法就是做个定时器,每隔1分钟检查一次,保活失效就remove掉。但定时到达的时候,有可能连接正忙,表现形式就是在这里稍稍卡一下(当然直接是感觉不出来的)。而且,这时有可能有事件发生,需要同时访问用户表,需要加锁。
而利用好idle就解决这个问题了:每个idle回调检查list的一个元素,失效就remove,否则更新计时,同时list指针下移一位。下一个idle回调,再检查下一个用户。因为idle是和事件先后出现的,访问同一个list时间也是先后的,不用加锁。
阅读(8261) | 评论(0) | 转发(0) |