Hello!
2013/10/8 shu chen:
> 选择这个方式的一个原因是不希望到redis的连接太多,担心影响了redis的性能。因为任务的种类非常多,每一类任务对应了redis中的一个队列。
> 对于同一类任务,timer只会被触发一次,然后在timer中启动一个或几个接收线程去接收任务,收到一个任务就会spawn一个work线程。
> 也就是说请求(任务)不是通过http方式到nginx的,而是在timer中的接收线程主动去redis中获取的,触发timer的请求相当于一个管理命令。
>
轻量级线程也是有开销的,无论是内存方面还是 CPU 方面。虽然相比 OS
线程要“轻”很多。一般地,为了系统整体的吞吐量,我们会努力控制轻线程的个数,防止数量过多。
一般地,通过大量分配异步“轻线程”是提高并发度的做法,而并发度的提高一般会伴随着单位任务的处理延时的增加和系统整体吞吐能力的下降。毕竟系统可用的
CPU 资源是一个常数。类似地,最多可以使用的内存也是一个常数。这是我对你的做法的担心。你可以自己多做一些实际测量。
对于你最初关于 ngx.thread.wait 的问题,我觉得引入一个 no hang 模式的 ngx.thread.wait()
还是有意义的。即在这种模式下,父线程只收割已经结束了的“僵尸子线程”。类似 C 函数 waitpid 的 WNOHANG
选项。或许引入一个新的 ngx.thread.reap() 函数?这样你可以在你的父线程中定期调用 ngx.thread.reap()
回收已经完成了的僵尸子线程。这里最主要的问题是僵尸子线程的积压与 ngx.thread.wait() 的挂起。
Regards,
-agentzh