On Wednesday, October 19, 2016 at 10:44:41 AM UTC+8, doujiang wrote:
Hello
在 2016年10月19日 上午9:56,rr Feng
<abi...@gmail.com>写道:
所以唯一的问题是 reload 的时候,新 worker 启动,旧 worker 还未退出,这样就有两个相同 id 的 worker 在运行。
对于某些必须确保唯一性的工作来说可能就得加锁了。
这个时候,你可以在 timer 触发的时候,检查 premature,如果 timer 是被提前触发,直接不执行就好了
如果是长任务,可以用 ngx.worker.exiting() 来判断,退出当前任务好了
这样并不可以。 premature 只有在 timer 启动的时候检查,如果一个 timer 要运行 1s,那么 old worker process 就会在 new worker process 出现的时候最多多运行 1s。
长任务判断 exiting 是一样的道理,不可能实时的知道 worker 退出了。
而且最重要的是,nginx 首先 fork new worker process,确保没问题了才会 kill old worker process,所以总会有两个 timer 在运行。
On Tuesday, October 18, 2016 at 8:03:24 PM UTC+8, wwaz wwaz wrote:
hello.
每个worker的id是master启动的时候就定下来的,不是PID,即使reload,这个worker的id也不会变化。
其实这个id就是worker的序列号。
我有一个项目里面用到了这个特性,保证一个worker执行timer。
目前没有发现有问题。
在 2016年10月18日星期二 UTC+8下午6:54:19,rr Feng写道:
感觉比锁方式更简单。
不过应该是还需要一个锁的,保证 new worker 启动的时候和 old worker 不会冲突……