1.多进程的调试 :
一个进程的处理(还是比不上调试一遍)
同时对日志的处理think
2.ngx_worker_process_cycle中处理
{
for ( ;; )
{ //不停的循环
ngx_process_events_and_timers(cycle); //最重要的
}
}
在ngx_process_events_and_timers中最重要的
{
ngx_process_events
ngx_event_process_posted
{
ngx_event_t *ev;
for ;;
{
ev = (ngx_event_t *) *posted;
ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
"posted event %p", ev);
printf("Get after ngx_event_process_posted!...");
if (ev == NULL) {
return;
}
ngx_delete_posted_event(ev);
ev->handler(ev);
}
}
}
直接epoll pocess
{
epoll_wait //直接到有响应
对每个事件进行循环 :
c = event_list[i].data.ptr;
instance = (uintptr_t) c & 1;
c = (ngx_connection_t *) ((uintptr_t) c & (uintptr_t) ~1);
rev = c->read;
。。。
rev->handler(rev); //这个就是 ngx_http_wait_request_handler
{ c->data = ngx_http_create_request(c);
rev->handler = ngx_http_process_request_line;
ngx_http_process_request_line(rev);
}
wev = c->write; //ngx_http_empty_handler
}
rev->handler(rev); 这个事件在这时就是 ngx_event_accept
不同的事件对应不同的处理函数
当有新连接时 ngx_event_accept
{
ngx_listening_t *ls;
}
在epoll中 ngx_connection_t *c;
c = event_list[i].data.ptr;
在ngx_epoll_add_event 中向 .ptr中赋值 //一般都是通过handler赋值
ngx_event_accept{
ngx_http_init_connection
{
ngx_handle_read_event
{
ngx_epoll_add_event
}
多进程和状态机明白了这和前面的多线程有什么关系呢?
NGX_THREADS 关于ngx线程的问题