2007年11月21日 星期三 17:19
试验 发现, 一个客户请求如果没有处理完, 另一个用户是无法得到响应的 -- LinuX Power
2007年11月21日 星期三 17:35
On Nov 21, 2007 5:19 PM, Marco <marco在waven.com> wrote: > 试验 发现, 一个客户请求如果没有处理完, 另一个用户是无法得到响应的 用threaded或者forked flup做前端 -- Qiangning Hong http://www.douban.com/people/hongqn/
2007年11月21日 星期三 18:39
缺省也是来参与 cherrypy 的 wsgiserver 啊,这个是线程池的. -------------- next part -------------- An HTML attachment was scrubbed... URL: http://python.cn/pipermail/python-chinese/attachments/20071121/e5d7d43a/attachment.html
2007年11月22日 星期四 11:50
地区后台用的CherryPY的wsgi服务器,不过web.py里面貌似用了很多模块级别的全局变量,这对于并发操作来说几乎是致命的。难道web.py一开始就是定位于CGI模式?抑或是单线程服务器。
2007年11月22日 星期四 14:52
CPython 的 GIL 本身就是确保了变量访问是单线程的吧... 我们基本上已经决定用 webpy 构建下一代的 web 应用了。呵呵,不晓得冒险结果如何
2007年11月22日 星期四 15:03
同一时间只运行一个线程,与单线程,是不同的。 GIL保证同一时间只有一个线程,是在多线程的情况下,一旦有一个线程等到IO等阻塞操作时,其他线程可以继续执行。但是web.py这种单线程方式意味着,如果一个用户正在访问,那么其他用户根本连不上。 当然,这种服务器其实可以用前面一个apache/lighttpd来挂后面的多个web.py实例来服务的。
2007年11月22日 星期四 15:51
你所谓的一个用户正在访问是什么意思呢?难道解释器不会把它切换走么?
不说理论的,写一个用缺省 wsgiserver(线程池)跑的测试程序:
import web, time
urls = ('/sleep', 'sleep', '/loop', 'loop', '/(.*)', 'hello')
class sleep:
def GET(self):
time.sleep(60)
print 'sleep over'
class loop:
def GET(self):
i = 1
while True:
i += 1
print 'loop over'
class hello:
def GET(self, name):
if not name: name = 'world'
print 'Hello,' + name + '!'
if __name__ == "__main__":
web.run(urls, globals(), web.reloader)
分别在 Linux 上和 Win32 上跑,用浏览器开三个窗口去分别访问。
一个是 sleep,另一个是占 CPU 的死循环,还有一个是正常请求
可以观察到 sleep 是绝对不会影响正常请求的。换句话就是说 server 在 I/O 等待期间(访问网络/数据库...),可以正常响应请求。
耗 CPU 的死循环稍微麻烦一点,但也绝对不会影响正常的请求。尤其是在 win32 下,基本上可以感觉到能立刻切换过来响应;在 Linux
下会有停顿,但延时也就几秒钟,也可以对正常请求响应。
在 Linux 上用 top 观察,可以看到 python 解释器只占了 50% 的 CPU。如果该 app 是用 C or Java
写的这种死循环..可能并发情况会更加恶化,CPU 根本不会切换出来。
后来在 loop 请求的时候,再用 ab 并发多个去请求正常链接,可以看到只要解释器有机会切换出来,就可以一次响应很多个请求
2007年11月22日 星期四 15:53
cherrypy 的 wsgiserver 是线程池的实现,你怎么会认为是单线程呢?
2007年11月22日 星期四 15:59
不好意思,我这几天也正好再看web.py的代码,只是看到很多全局变量,暂时没看到wsgi服务器那里,以为这些全局变量的限制而不会做多线程。 有测试用例很好,心服口服。
2007年11月23日 星期五 09:12
On Nov 22, 2007 3:51 PM, Yingbo Qiu <qiuyingbo at gmail.com> wrote: > 你所谓的一个用户正在访问是什么意思呢?难道解释器不会把它切换走么? > 不说理论的,写一个用缺省 wsgiserver(线程池)跑的测试程序: > > import web, time > > urls = ('/sleep', 'sleep', '/loop', 'loop', '/(.*)', 'hello') > > class sleep: > def GET(self): > time.sleep(60) > print 'sleep over' > > class loop: > def GET(self): > i = 1 > while True: > i += 1 > print 'loop over' > > class hello: > def GET(self, name): > if not name: name = 'world' > print 'Hello,' + name + '!' > > if __name__ == "__main__": > web.run(urls, globals(), web.reloader) > > > 分别在 Linux 上和 Win32 上跑,用浏览器开三个窗口去分别访问。 > 一个是 sleep,另一个是占 CPU 的死循环,还有一个是正常请求 > 这样 不足以证明 web.py 是线程安全的。
2007年11月23日 星期五 17:26
#!/usr/bin/python
#Filename: http-server.py
import sys
import web
try:
import psyco
psyco.full()
except:
pass
urls = (
'/cmd', 'CMD'
)
class CMD:
def GET(self):
while True:
print "hello"
#web.webapi.internalerror = web.debugerror
##########################
if __name__ == '__main__':
web.run(urls, globals())
这个程序, 浏览器访问/cmd/?ls='/home' 时, 无响应, CPU进程100%, 再开另一个浏览器,
也无响应(conneted, wait for reply)
On 11/23/07, lubiao <lubiao.py在gmail.com> wrote:
> On Nov 22, 2007 3:51 PM, Yingbo Qiu <qiuyingbo在gmail.com> wrote:
> > 你所谓的一个用户正在访问是什么意思呢?难道解释器不会把它切换走么?
> > 不说理论的,写一个用缺省 wsgiserver(线程池)跑的测试程序:
> >
> > import web, time
> >
> > urls = ('/sleep', 'sleep', '/loop', 'loop', '/(.*)', 'hello')
> >
> > class sleep:
> > def GET(self):
> > time.sleep(60)
> > print 'sleep over'
> >
> > class loop:
> > def GET(self):
> > i = 1
> > while True:
> > i += 1
> > print 'loop over'
> >
> > class hello:
> > def GET(self, name):
> > if not name: name = 'world'
> > print 'Hello,' + name + '!'
> >
> > if __name__ == "__main__":
> > web.run(urls, globals(), web.reloader)
> >
> >
> > 分别在 Linux 上和 Win32 上跑,用浏览器开三个窗口去分别访问。
> > 一个是 sleep,另一个是占 CPU 的死循环,还有一个是正常请求
> >
>
> 这样 不足以证明 web.py 是线程安全的。
> _______________________________________________
> python-chinese
> Post: send python-chinese在lists.python.cn
> Subscribe: send subscribe to python-chinese-request在lists.python.cn
> Unsubscribe: send unsubscribe to python-chinese-request在lists.python.cn
> Detail Info: http://python.cn/mailman/listinfo/python-chinese
--
LinuX Power
2007年11月23日 星期五 18:03
这个不是 webpy 的问题,而是在这种应用占了 100%cpu 的情况下,OS 无法切换出来执行别的线程. 而且在我这里即使安装了 psyco 也仍然是 50% cpu ... 奇怪
Zeuux © 2025
京ICP备05028076号