Hello!
2013/5/11 刘小杰:
> 本人也常在工作中开发基于Nginx的Http或TCP模块,有两个问题一直困扰着我,特向你请教:
> 1. Nginx是多进程的,如果因为业务需要,要定时某一个任务时,总是会多个子进程同时触发,而我只希望有一个进程触发就可以了,这种情况下应该怎么做?
> ---- 我目前用了一个比较笨的方法,使用了一个文件锁,哪个worker获取到锁有哪个进程执行任务,并记录相应的时间。
>
可以使用共享内存来摸拟 worker 进程间同步所需的锁。比如在 ngx_lua 模块中可以在 Lua 里面直接使用其共享内存字典 API
来实现这样的功能(即同步不同 worker 之间通过 ngx.timer.at 创建的定时器)。
> 第二个问题,可能不属于Nginx开发特有,但也跟Nginx多进程有关。就是在多进程环境中如果我要使用类似Map这样的数据结构, 并且只有一份数据,
> 该如何做?
> 简单的说就是想所有的worker共用一个map, 所有添加,更新的数据都是共享的,
> 使用共享内存的话,只能是整个内存块,使用像数组这样的简单的数据结构。
>
可以在共享内存里实现各种各样的数据结构,比如 ngx_lua 就实现了一个简单的类似 memcached 那样的共享内存字典(基于红黑树):
http://wiki.nginx.org/HttpLuaModule#ngx.shared.DICT
同时抄送给 openresty 中文邮件列表:https://groups.google.com/group/openresty
建议加入此列表并总是在那里交流这样的问题,谢谢合作!
Best regards,
-agentzh