作者回复: Nginx 是以性能优先作为设计理念的,它会把时间缓存下来。从 ngx.now 的源码中我们可以得到印证:
static int
ngx_http_lua_ngx_now(lua_State *L)
{
ngx_time_t *tp;
tp = ngx_timeofday();
lua_pushnumber(L, (lua_Number) (tp->sec + tp->msec / 1000.0L));
return 1;
}
是调用了 Nginx 中的 ngx_timeofday 函数获取的时间。
而这个函数其实是一个宏定义:
#define ngx_timeofday() (ngx_time_t *) ngx_cached_time
而 ngx_cached_time 的值只在函数 ngx_time_update 中会更新。
那问题就简化为: ngx_time_update什么时候会被调用。如果你在 Nginx 的源码中去跟踪它的话,就会发现ngx_time_update的调用比较多,在事件循环中都有出现。
作者回复: return 是很明确的跳出了这个函数,不再执行后面的语句。
作者回复: windows 下这个函数是有问题的,最好在 Linux、mac 下来使用 OpenResty
作者回复: 因为 ngx.sleep 也是一个 yield 操作,会触发 nginx 的事件循环。
作者回复: 是的,没错