Loading...
Something went wrong while trying to load the full version of this site. Try hard-refreshing this page to fix the error.
不是,worker.id取的是worker_num,而worker_number是spwan_ worker传进来的i,而不是slot
在 2016年7月29日星期五 UTC+8上午12:19:20,楓之舞写道:当时考虑 ngx.worker.id() 获得是系统分配的进程ID。每次会变,不好在配置文件里绑定。另外,如果绑定的话,一旦对应的worker异常退出。任务就不会再处理。比较麻烦。 其实我觉得用nginx中的定时任务会隐藏太多复杂度。倒不如直接用另一个程序定时调用nginx http 接口,获取需要的值 :) 2016-07-28 17:22 GMT+08:00 <soae...@gmail.com>:恩 是的如果用 ngx.worker.id() 的话就不用枷锁了,况且在init_worker_by*中好似不能使用 lua-resty-lock 的
在 2016年7月28日星期四 UTC+8下午2:05:46,WenMing写道:你用 ngx.worker.id() 的话,就不用锁了。直接绑定在某个 NGINX worker 上面运行。在 2016年7月27日 下午11:00,.楓之舞 <chang...@gmail.com>写道:我在 init_work_by_lua 中这样做的:比如,任务每隔60秒执行一次:---------------------
handler = function (premature)
-- do some routine job in Lua just like a cron job
if premature then
return
end
local success, err, forcible = tags:add("xxxx", ngx.now(), 60)if success then-- 锁抢到了。执行任务...else
-- 锁没有抢到。其他程序已经处理了
end
local ok, err = ngx.timer.at(ceil(delay/10), handler)
if not ok then
ngx.log(ngx.ERR, "failed to create the timer: ", err)
return
end
end
-- 第一次添加一个延时. 延时时间: math.random(8, 32). 避免一堆worker同时抢锁
local ok, err = ngx.timer.at(delay + math.random(8, 32), handler)
if not ok then
ngx.log(ngx.ERR, "failed to create the timer: ", err)
return
end
---------------------
2016-07-27 16:48 GMT+08:00 YuanSheng Wang <yuan...@openresty.org>:2016-07-27 15:51 GMT+08:00 <soae...@gmail.com>:恩在init_work_by_lua中根据ngx.worker.id () 来决定最终执行定时器的进程是谁。这个问题解决了,哈哈谢谢,不过当nginx的某个worker进程被kill掉以后 nginx master进程会继续fork出新的进程, 这个时候还是要判断到底kill掉的进程是否是启动定时器的进程 。 还在解决中 新 fork 出来的进程,ngx.worker.id() 返回结果是一致的。所以比较容易完成某个 worker 工作的需求。
在 2016年7月27日星期三 UTC+8上午11:32:53,WenMing写道:在 2016年7月27日 上午11:03, <soae...@gmail.com>写道:Hello,--现在遇到一个问题就是我想创建一个定时器,然后定时的去更新ngx.shared.DICT 中的值,我担心的是会不会我创建了一个定时器后 所有的work process都会用这个定时器去更新 ngx.shared.DICT )里面的值,我的主要目的是想只有一个进程去更新,而不是所有的进程都去用这个定时器。不知道怎么做这个
--
--YuanSheng Wang--------------------------------------- My Github: https://github.com/membphis OpenResty lover ^_^--
--
--
当时考虑 ngx.worker.id() 获得是系统分配的进程ID。每次会变,不好在配置文件里绑定。
另外,如果绑定的话,一旦对应的worker异常退出。任务就不会再处理。比较麻烦。其实我觉得用nginx中的定时任务会隐藏太多复杂度。倒不如直接用另一个程序定时调用nginx http 接口,获取需要的值 :)--2016-07-28 17:22 GMT+08:00 <soa...@gmail.com>:恩 是的如果用 ngx.worker.id() 的话就不用枷锁了,况且在init_worker_by*中好似不能使用 lua-resty-lock 的
在 2016年7月28日星期四 UTC+8下午2:05:46,WenMing写道:你用 ngx.worker.id() 的话,就不用锁了。直接绑定在某个 NGINX worker 上面运行。在 2016年7月27日 下午11:00,.楓之舞 <chang...@gmail.com>写道:我在 init_work_by_lua 中这样做的:比如,任务每隔60秒执行一次:---------------------
handler = function (premature)
-- do some routine job in Lua just like a cron job
if premature then
return
end
local success, err, forcible = tags:add("xxxx", ngx.now(), 60)if success then-- 锁抢到了。执行任务...else
-- 锁没有抢到。其他程序已经处理了
end
local ok, err = ngx.timer.at(ceil(delay/10), handler)
if not ok then
ngx.log(ngx.ERR, "failed to create the timer: ", err)
return
end
end
-- 第一次添加一个延时. 延时时间: math.random(8, 32). 避免一堆worker同时抢锁
local ok, err = ngx.timer.at(delay + math.random(8, 32), handler)
if not ok then
ngx.log(ngx.ERR, "failed to create the timer: ", err)
return
end
---------------------
2016-07-27 16:48 GMT+08:00 YuanSheng Wang <yuan...@openresty.org>:2016-07-27 15:51 GMT+08:00 <soae...@gmail.com>:恩在init_work_by_lua中根据ngx.worker.id() 来决定最终执行定时器的进程是谁。这个问题解决了,哈哈谢谢,不过当nginx的某个worker进程被kill掉以后 nginx master进程会继续fork出新的进程,这个时候还是要判断到底kill掉的进程是否是启动定时器的进程。 还在解决中新 fork 出来的进程,ngx.worker.id() 返回结果是一致的。所以比较容易完成某个 worker 工作的需求。
在 2016年7月27日星期三 UTC+8上午11:32:53,WenMing写道:在 2016年7月27日 上午11:03, <soae...@gmail.com>写道:Hello,--现在遇到一个问题就是我想创建一个定时器,然后定时的去更新ngx.shared.DICT中的值,我担心的是会不会我创建了一个定时器后 所有的work process都会用这个定时器去更新ngx.shared.DICT)里面的值,我的主要目的是想只有一个进程去更新,而不是所有的进程都去用这个定时器。不知道怎么做这个
--
--YuanSheng Wang---------------------------------------My Github: https://github.com/membphisOpenResty lover ^_^--
--
--
2016-07-29 0:19 GMT+08:00 .楓之舞 <chang...@gmail.com>:当时考虑 ngx.worker.id() 获得是系统分配的进程ID。每次会变,不好在配置文件里绑定。注意 ngx.worker.id() 和 ngx.worker.pid() 是不一样的。前者获取的是 nginx 内部分配的顺序 ID,后者才是进程 ID。另外,如果绑定的话,一旦对应的worker异常退出。任务就不会再处理。比较麻烦。其实我觉得用nginx中的定时任务会隐藏太多复杂度。倒不如直接用另一个程序定时调用nginx http 接口,获取需要的值 :)--2016-07-28 17:22 GMT+08:00 <soa...@gmail.com>:恩 是的如果用 ngx.worker.id() 的话就不用枷锁了,况且在init_worker_by*中好似不能使用 lua-resty-lock 的
在 2016年7月28日星期四 UTC+8下午2:05:46,WenMing写道:你用 ngx.worker.id() 的话,就不用锁了。直接绑定在某个 NGINX worker 上面运行。在 2016年7月27日 下午11:00,.楓之舞 <chang...@gmail.com>写道:我在 init_work_by_lua 中这样做的:比如,任务每隔60秒执行一次:---------------------
handler = function (premature)
-- do some routine job in Lua just like a cron job
if premature then
return
end
local success, err, forcible = tags:add("xxxx", ngx.now(), 60)if success then-- 锁抢到了。执行任务...else
-- 锁没有抢到。其他程序已经处理了
end
local ok, err = ngx.timer.at(ceil(delay/10), handler)
if not ok then
ngx.log(ngx.ERR, "failed to create the timer: ", err)
return
end
end
-- 第一次添加一个延时. 延时时间: math.random(8, 32). 避免一堆worker同时抢锁
local ok, err = ngx.timer.at(delay + math.random(8, 32), handler)
if not ok then
ngx.log(ngx.ERR, "failed to create the timer: ", err)
return
end
---------------------
2016-07-27 16:48 GMT+08:00 YuanSheng Wang <yuan...@openresty.org>:2016-07-27 15:51 GMT+08:00 <soae...@gmail.com>:恩在init_work_by_lua中根据ngx.worker.id() 来决定最终执行定时器的进程是谁。这个问题解决了,哈哈谢谢,不过当nginx的某个worker进程被kill掉以后 nginx master进程会继续fork出新的进程,这个时候还是要判断到底kill掉的进程是否是启动定时器的进程。 还在解决中新 fork 出来的进程,ngx.worker.id() 返回结果是一致的。所以比较容易完成某个 worker 工作的需求。
在 2016年7月27日星期三 UTC+8上午11:32:53,WenMing写道:在 2016年7月27日 上午11:03, <soae...@gmail.com>写道:Hello,--现在遇到一个问题就是我想创建一个定时器,然后定时的去更新ngx.shared.DICT中的值,我担心的是会不会我创建了一个定时器后 所有的work process都会用这个定时器去更新ngx.shared.DICT)里面的值,我的主要目的是想只有一个进程去更新,而不是所有的进程都去用这个定时器。不知道怎么做这个
--
--YuanSheng Wang---------------------------------------My Github: https://github.com/membphisOpenResty lover ^_^--
--
--
--YuanSheng Wang---------------------------------------My Github: https://github.com/membphisOpenResty lover ^_^
我也有类似的场景,我的做法是:使用共享内存的add方法来抢锁,谁抢到了就由哪个worker来做(假设A抢到), 没抢到的worker各起一个守护定时器(假设B、C、D), 定时监测worker A是否在做事; 当发现worker A几个周期都没有在工作的时候,比如:worker A异常crash、或被阻塞了等。则B、C、C再次执行抢锁。
在 2016年7月27日星期三 UTC+8下午3:51:56,soae...@gmail.com 写道:恩在init_work_by_lua中根据ngx.worker.id () 来决定最终执行定时器的进程是谁。这个问题解决了,哈哈谢谢,不过当nginx的某个worker进程被kill掉以后 nginx master进程会继续fork出新的进程, 这个时候还是要判断到底kill掉的进程是否是启动定时器的进程 。 还在解决中
在 2016年7月27日星期三 UTC+8上午11:32:53,WenMing写道:在 2016年7月27日 上午11:03, <soae...@gmail.com>写道:Hello,--现在遇到一个问题就是我想创建一个定时器,然后定时的去更新ngx.shared.DICT 中的值,我担心的是会不会我创建了一个定时器后 所有的work process都会用这个定时器去更新 ngx.shared.DICT )里面的值,我的主要目的是想只有一个进程去更新,而不是所有的进程都去用这个定时器。不知道怎么做这个
我也有类似的场景,我的做法是:使用共享内存的add方法来抢锁,谁抢到了就由哪个worker来做(假设A抢到), 没抢到的worker各起一个守护定时器(假设B、C、D), 定时监测worker A是否在做事; 当发现worker A几个周期都没有在工作的时候,比如:worker A异常crash、或被阻塞了等。则B、C、C再次执行抢锁。
在 2016年7月27日星期三 UTC+8下午3:51:56,soae...@gmail.com 写道:恩在init_work_by_lua中根据ngx.worker.id () 来决定最终执行定时器的进程是谁。这个问题解决了,哈哈谢谢,不过当nginx的某个worker进程被kill掉以后 nginx master进程会继续fork出新的进程, 这个时候还是要判断到底kill掉的进程是否是启动定时器的进程 。 还在解决中
在 2016年7月27日星期三 UTC+8上午11:32:53,WenMing写道:在 2016年7月27日 上午11:03, <soae...@gmail.com>写道:Hello,--现在遇到一个问题就是我想创建一个定时器,然后定时的去更新ngx.shared.DICT 中的值,我担心的是会不会我创建了一个定时器后 所有的work process都会用这个定时器去更新 ngx.shared.DICT )里面的值,我的主要目的是想只有一个进程去更新,而不是所有的进程都去用这个定时器。不知道怎么做这个
哥们,你是怎么抢锁的,。。。不用ngx.worker.id() (tengine里面用不了)
在 2016年7月27日星期三 UTC-7下午6:02:52,Guanglin Lv写道:我也有类似的场景,我的做法是:使用共享内存的add方法来抢锁,谁抢到了就由哪个worker来做(假设A抢到),没抢到的worker各起一个守护定时器( 假设B、C、D),定时监测worker A是否在做事; 当发现worker A几个周期都没有在工作的时候,比如:worker A异常crash、或被阻塞了等。则B、C、C再次执行抢锁。
在 2016年7月27日星期三 UTC+8下午3:51:56,soae...@gmail.com 写道:恩在init_work_by_lua中根据ngx.worker.id () 来决定最终执行定时器的进程是谁。这个问题解决了,哈哈谢谢,不过当nginx的某个worker进程被kill掉以后 nginx master进程会继续fork出新的进程,这个时候还是要判断 到底kill掉的进程是否是启动定时器的进程。 还在解决中
在 2016年7月27日星期三 UTC+8上午11:32:53,WenMing写道:在 2016年7月27日 上午11:03, <soae...@gmail.com>写道:Hello,--现在遇到一个问题就是我想创建一个定时器,然后定时的去更新ngx.shared.DICT 中的值,我担心的是会不会我创建了一个定时器后 所有的work process都会用这个定时器去更新 ngx.shared.DICT )里面的值,我的主要目的是想只有一个进程去更新,而不是所有的进程都去用这个定时器。不知道怎么做这个
--
你有用到 Tengine 的什么特性吗?它带的 ngx lua 版本比较旧在 2016年8月8日 下午6:29,wwaz wwaz <3824...@qq.com>写道:哥们,你是怎么抢锁的,。。。不用ngx.worker.id() (tengine里面用不了)
在 2016年7月27日星期三 UTC-7下午6:02:52,Guanglin Lv写道:我也有类似的场景,我的做法是:使用共享内存的add方法来抢锁,谁抢到了就由哪个worker来做(假设A抢到), 没抢到的worker各起一个守护定时器(假设B、C、D), 定时监测worker A是否在做事; 当发现worker A几个周期都没有在工作的时候,比如:worker A异常crash、或被阻塞了等。则B、C、C再次执行抢锁。
在 2016年7月27日星期三 UTC+8下午3:51:56,soae...@gmail.com 写道:恩在init_work_by_lua中根据ngx.worker.id () 来决定最终执行定时器的进程是谁。这个问题解决了,哈哈谢谢,不过当nginx的某个worker进程被kill掉以后 nginx master进程会继续fork出新的进程, 这个时候还是要判断到底kill掉的进程是否是启动定时器的进程 。 还在解决中
在 2016年7月27日星期三 UTC+8上午11:32:53,WenMing写道:在 2016年7月27日 上午11:03, <soae...@gmail.com>写道:Hello,--现在遇到一个问题就是我想创建一个定时器,然后定时的去更新ngx.shared.DICT 中的值,我担心的是会不会我创建了一个定时器后 所有的work process都会用这个定时器去更新 ngx.shared.DICT )里面的值,我的主要目的是想只有一个进程去更新,而不是所有的进程都去用这个定时器。不知道怎么做这个
--