- 论坛徽章:
- 0
|
原帖由 chenzhanyiczy 于 2008-10-11 13:01 发表 ![]()
apache的队列是不是在线程池没有可用线程的时候才起作用的?也就是说,当线程池还有很多idle线程的时候,请求就直接处理,完全不用队列来保存然后在处理,因为这样作的好处是节省了响应时间,没有必要在通 ...
不是这样的。
epoll线程在得到连接后就尝试获取是否有空闲的工作线程,也就是调用epoll thread->get_worker()->ap_queue_info_wait_for_idler()->push2worker() 这个push2worker是将句柄放到了一个工作线程共用的队列 fd_queue_t *queue,
而线程池中的工作线程其实在启动后就是一直在等待在这个队列的 apr_thread_cond_t *not_empty条件变量满足,也就是有活干,当epoll线程signal条件变量以后,线程池中的某个线程就会开始工作。你上面说“当线程池还有很多idle线程的时候,请求就直接处理“,其实这句话里说的直接处理有两种方式,一种是直接交给空闲工作线程处理,这种方式仍然需要epoll线程和工作线程之间有个通讯数据结构的存在,基本没大改进。令一种是由epoll线程去处理任务,而在选出一个新的空闲线程去运行epoll,这个应该就是常说的Leader/Follower模式,这会有些改进,但考虑到整个结构其实就似乎没必要拉,因为apache是多进程在分别运行epoll线程的,我们上面讨论的只是局部的一个进程。
另外,这个地方的工作线程里可能需要加载很多的处理模块,如php,rewrite等等的回调方法,并且会有一个状态机来维护会话状态的转换,所以线程职责的改变会大大增加问题的复杂性。 |
|