libco
libco copied to clipboard
co_epoll_wait 的 timeout 设置优化。
co_epoll_wait 的 timeout 这里默认为 1 有点暴力了,建议先捞一个快到期的事件,当前时间与到期的时间差进行等待。详细可以参考 redis 的事件处理: numevents = aeApiPoll(eventLoop, tvp);
void co_eventloop(stCoEpoll_t *ctx, pfn_co_eventloop_t pfn, void *arg) {
...
for (;;) {
int ret = co_epoll_wait(ctx->iEpollFd, result, stCoEpoll_t::_EPOLL_SIZE, 1);
...
}
...
}
我就做了这个优化,把计时器中最近的一个计时器距离现在的时间作为epoll超时时间,但是其实系统如果进入epoll,说明没有活跃协程了,设置1多轮询几次也没啥毛病
我就做了这个优化,把计时器中最近的一个计时器距离现在的时间作为epoll超时时间,但是其实系统如果进入epoll,说明没有活跃协程了,设置1多轮询几次也没啥毛病
请问你说的活跃协程是用来做什么工作的?具体场景是啥?举个栗子。
我就做了这个优化,把计时器中最近的一个计时器距离现在的时间作为epoll超时时间,但是其实系统如果进入epoll,说明没有活跃协程了,设置1多轮询几次也没啥毛病
请问你说的活跃协程是用来做什么工作的?具体场景是啥?举个栗子。
我没有细看libco调度器的模型,我在我自己写的协程库中,调度器主循环负责唤起协程列表(协程在这里说明协程需要时间片)中所有协程,当这个列表没有协程了,说明当前存在空闲时间片了,此时主循环才进入epoll并把超时时间设置为最近的计时器的触发时间,你可以到我的仓库看一看 https://github.com/hsbyhub/libxco