nginx中的阻塞和非阻塞设置

分类: 注册送365元可提款 时间: 2026-11-08 20:02:44 作者: admin 阅读: 1099 点赞: 607
nginx中的阻塞和非阻塞设置

纵然对于select,epoll这2个模型,既可以使用阻塞模式的socket也可以使用非阻塞的虽然,但是这2个模型的消息通知可以防止accetp,recv在阻塞模式下的进入阻塞状态,却不能防止NGINX主动发出的connect和send进入阻塞状态特别是NGINX是单线程模型,任何调用的阻塞状态都会造成整个线程阻塞甚至挂起,这对NGINX来说是完全不能接受的因此在ngx_open_listening_sockets函数中,对所有listen socket,除非是IOCP或者UNIX_AIO模型,都把这个socket设置成非阻塞模式,代码如下:

if (!(ngx_event_flags & NGX_USE_AIO_EVENT)) {

if (ngx_nonblocking(s) == -1) {

ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,

ngx_nonblocking_n " %V failed",

&ls[i].addr_text);

if (ngx_close_socket(s) == -1) {

ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,

ngx_close_socket_n " %V failed",

&ls[i].addr_text);

}

return NGX_ERROR;

}

}

而在ngx_event_accept中,也有一样的实现逻辑

/* set a blocking mode for aio and non-blocking mode for others */

if (ngx_inherited_nonblocking) {

if (ngx_event_flags & NGX_USE_AIO_EVENT) {

if (ngx_blocking(s) == -1) {

ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_socket_errno,

ngx_blocking_n " failed");

ngx_close_accepted_connection(c);

return;

}

}

} else {

if (!(ngx_event_flags & (NGX_USE_AIO_EVENT|NGX_USE_RTSIG_EVENT))) {

if (ngx_nonblocking(s) == -1) {

ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_socket_errno,

ngx_nonblocking_n " failed");

ngx_close_accepted_connection(c);

return;

}

}

}

比较特殊的是connect,unix平台的传统的做法都是让connect的socket进入非阻塞模式,NGINX也是这样,在ngx_event_connect_peer中,直接设置成非阻塞模式了事

if (ngx_nonblocking(s) == -1) {

ngx_log_error(NGX_LOG_ALERT, pc->log, ngx_socket_errno,

ngx_nonblocking_n " failed");

goto failed;

}

另外补充一点,win平台上的WsaAysncSelect以及WsaEventSelect会自动把套接口设置成非阻塞模式,因此不管connect,send,accept,recv都是非阻塞模式,并且有各自对应的通知消息类型

转载自:http://blog.csdn.net/namelcx/article/details/66975561

相关推荐

世界杯(世界杯) 2018资料库
注册送365元可提款

世界杯(世界杯) 2018资料库

📅 06-29 👁️ 8922
探索熊黛林的身高之谜
365bet365体育在线

探索熊黛林的身高之谜

📅 10-18 👁️ 1126
为什么冬天静电多?
365彩票是不是诈骗呢

为什么冬天静电多?

📅 08-27 👁️ 2610