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号