Python论坛  - 讨论区

标题:[python-chinese] 弱弱得问一下, web.py是不是单线程实现的?

2007年11月21日 星期三 17:19

Marco marco在waven.com
星期三 十一月 21 17:19:52 HKT 2007

试验 发现, 一个客户请求如果没有处理完, 另一个用户是无法得到响应的


-- 
LinuX Power

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年11月21日 星期三 17:35

Qiangning Hong hongqn在gmail.com
星期三 十一月 21 17:35:35 HKT 2007

On Nov 21, 2007 5:19 PM, Marco <marco在waven.com> wrote:
> 试验 发现, 一个客户请求如果没有处理完, 另一个用户是无法得到响应的

用threaded或者forked flup做前端

-- 
Qiangning Hong
http://www.douban.com/people/hongqn/

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年11月21日 星期三 18:39

Yingbo Qiu qiuyingbo在gmail.com
星期三 十一月 21 18:39:31 HKT 2007

缺省也是来参与 cherrypy 的 wsgiserver 啊,这个是线程池的.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://python.cn/pipermail/python-chinese/attachments/20071121/e5d7d43a/attachment.html 

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年11月22日 星期四 11:50

doudou doudou array.doudou在gmail.com
星期四 十一月 22 11:50:06 HKT 2007

地区后台用的CherryPY的wsgi服务器,不过web.py里面貌似用了很多模块级别的全局变量,这对于并发操作来说几乎是致命的。难道web.py一开始就是定位于CGI模式?抑或是单线程服务器。

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年11月22日 星期四 14:52

Yingbo Qiu qiuyingbo在gmail.com
星期四 十一月 22 14:52:42 HKT 2007

CPython 的 GIL 本身就是确保了变量访问是单线程的吧...

我们基本上已经决定用 webpy 构建下一代的 web 应用了。呵呵,不晓得冒险结果如何

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年11月22日 星期四 15:03

doudou doudou array.doudou在gmail.com
星期四 十一月 22 15:03:27 HKT 2007

同一时间只运行一个线程,与单线程,是不同的。

GIL保证同一时间只有一个线程,是在多线程的情况下,一旦有一个线程等到IO等阻塞操作时,其他线程可以继续执行。但是web.py这种单线程方式意味着,如果一个用户正在访问,那么其他用户根本连不上。

当然,这种服务器其实可以用前面一个apache/lighttpd来挂后面的多个web.py实例来服务的。

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年11月22日 星期四 15:51

Yingbo Qiu qiuyingbo在gmail.com
星期四 十一月 22 15:51:17 HKT 2007

你所谓的一个用户正在访问是什么意思呢?难道解释器不会把它切换走么?
不说理论的,写一个用缺省 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 并发多个去请求正常链接,可以看到只要解释器有机会切换出来,就可以一次响应很多个请求

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年11月22日 星期四 15:53

Yingbo Qiu qiuyingbo在gmail.com
星期四 十一月 22 15:53:13 HKT 2007

cherrypy 的 wsgiserver 是线程池的实现,你怎么会认为是单线程呢?

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年11月22日 星期四 15:59

doudou doudou array.doudou在gmail.com
星期四 十一月 22 15:59:15 HKT 2007

不好意思,我这几天也正好再看web.py的代码,只是看到很多全局变量,暂时没看到wsgi服务器那里,以为这些全局变量的限制而不会做多线程。
有测试用例很好,心服口服。

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年11月23日 星期五 09:12

lubiao lubiao.py在gmail.com
星期五 十一月 23 09:12:35 HKT 2007

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 是线程安全的。

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年11月23日 星期五 17:26

Marco marco在waven.com
星期五 十一月 23 17:26:27 HKT 2007

#!/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

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年11月23日 星期五 18:03

Yingbo Qiu qiuyingbo在gmail.com
星期五 十一月 23 18:03:28 HKT 2007

这个不是 webpy 的问题,而是在这种应用占了 100%cpu 的情况下,OS 无法切换出来执行别的线程.

而且在我这里即使安装了 psyco 也仍然是 50% cpu ... 奇怪

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

如下红色区域有误,请重新填写。

    你的回复:

    请 登录 后回复。还没有在Zeuux哲思注册吗?现在 注册 !

    Zeuux © 2025

    京ICP备05028076号