事件框架处理流程
每个worker子进程都在ngx_worker_process_cycle方法中循环处理事件,处理分发事件则在ngx_worker_process_cycle方法中调用ngx_process_events_and_timers方法,循环调用该方法就是 在处理所有事件,这正是事件驱动机制的核心。该方法既会处理普通的网络事件,也会处理定时器事件。
ngx_process_events_and_timers方法中核心操作主要有以下3个:
1) 调用所使用事件驱动模块实现的process_events方法,处理网络事件
2) 处理两个post事件队列中的事件,实际上就是分别调用ngx_event_process_posted(cycle, &ngx_posted_accept_events)和ngx_event_process_posted(cycle,&ngx_posted_events)方法
3) 处理定时事件,实际上就是调用ngx_event_expire_timers()方法
下面是ngx_process_events_and_timers方法中的时间框架处理流程图以及源代码,可以结合理解:
源代码如下:
void
ngx_process_events_and_timers(ngx_cycle_t *cycle)
{
ngx_uint_t flags;
ngx_msec_t timer, delta;
/*如果配置文件中使用了timer_resolution配置项,也就是ngx_timer_resolution值大于0,
则说明用户希望服务器时间精度为ngx_timer_resolution毫秒。这时,将ngx_process_changes
的timer参数设为-1,告诉ngx_process_change方法在检测时间时不要等待,直接搜集所有已经
就绪的时间然后返回;同时将flag参数初始化为0,它是在告诉ngx_process_changes没有任何附加
动作*/
if (ngx_timer_resolution) {
timer = NGX_TIMER_INFINITE;
flags = 0;
} else {
/*如果没有使用timer_resolution,那么将调用ngx_event_find_timer()方法,获取最近一个将要
触发的时间距离现在有多少毫秒,然后把这个值赋予timer参数,告诉ngx_process_change方法在
检测事件时如果没有任何事件,最多等待timer毫秒就返回;将flag参数设置为UPDATE_TIME,告诉
ngx_process_change方法更新换成的时间*/
timer = ngx_event_find_timer();
flags = NGX_UPDATE_TIME;
#if (NGX_THREADS)
if (timer == NGX_TIMER_INFINITE || timer > 500) {
timer = 500;
}
#endif
}
/*ngx_use_accept_mutex表示是否需要通过对accept加锁来解决惊群问题。
当nginx worker进程数>1时且配置