- 论坛徽章:
- 0
|
最近一直在学习quixote .
根据白皮书的推荐, 使用 scgi 方式和 apache进行 请求和回应的传递.
然后,看到 文档中有 multithread,, 就依样生成了一个 继承 Publiser似乎支持多线程的 ThreadPublisher.
然后,又 google 得知: 按文档那样搞还不行,需要加一个类的变量: is_thread_safe = True. 才能真正支持的多线程请求。
既然 有is_thread_safe 才能支持多线程, quixote.server.scgi_server 中应该有对该类变量的判断,结果,学习了一下scgi_server.py 发现:没有!!!
继续深入: 学习scgi-1.14的源代码,在scgi_server.py 中也没发现对该类变量的引用,, 而且在学习scgi-1.14的源代码过程中有了新的困惑...
scgi ,是以进程的方式工作,请求到来时,scgi,的父进程,会根据情况,fork出子进程对请求进行处理,默认最多fork出5个,超过5个并发的请求就排队等待,这样,每个子进程都会生成一个quixote_handler的实例,每个quixote_handler的实例,又会生成一个 publisher 的实例,意味着: 五个进程里,有5个publisher,就有5个sessionmanager...scgi-1.14源代码的注释中写道:”尽量用同一个子进程程,处理来自一个地方的请求“,也就是说,不保证,该IP的请求,不被分配到其他子进程去.. 而publisher.py中又明确的说明: "singleton的publisher是针对进程的!"
若一个请求在子进程1 中,存了一个session, 下次请求,被分配到子进程2中,子进程2的sessionmanager 的 dict中并没有该session存在,对该用户而言就是session的丢失,,
是不是可以理解为: scgi方式下,不可把session放到默认的dict中,必须把session 持久化起来? 这是一个困惑..
另外,既然 scgi 以进程方式运作,,且scgi_server的源代码中,没有对线程生成的处理,是否,quixote 的文档中的 multithread 对 scgi无效? 这是困惑二。
那末multithread在什么时候起作用呢? 继续学习 publisher的代码,及 quixote.wsgi的代码,发现,以wsgi方式和apache链接,,才是多线程的方式,文档的multithread才起作用。。。
不知这个理解对不对? |
|