Web.py:多个浏览器标签无法实现多线程行为

1 投票
1 回答
1864 浏览
提问于 2025-04-16 14:19

我听说Web.py默认是一个多线程的网络服务器。所以我创建了一个简单的应用,它在返回“Hello World”之前会先睡眠一分钟。

现在,如果我几乎同时从两个不同的浏览器访问这个应用(也就是访问http://localhost:8080/),我会在两个浏览器中几乎同时收到“Hello World”,这说明Web.py的多线程功能正常。

但是,如果我在同一个浏览器中打开两个标签页,并几乎同时(相隔几秒)访问同一个网址,我会在第一个标签页中按预期在60秒后收到“Hello World”,然后在第二个标签页中再过60秒才收到。这总共花了120秒。这说明Web.py没有实现多线程。

我想最终创建一个Python客户端应用(使用httplib2),它会从不同的线程发出HTTP请求。这些来自不同线程的HTTP请求可能是完全相同的。我假设这和在同一个浏览器中从不同标签页发出HTTP请求是差不多的。

有没有什么办法可以在这种情况下实现多线程的效果?或者我哪里做错了?需要对web.py进行特别的配置吗?或者有没有其他(简单的)网络框架可以达到我想要的效果?

1 个回答

5

你描述的情况似乎只在某些浏览器中出现。经过一番尝试,我创建了一个简单的 web.py 应用,让它在响应请求之前先暂停一会儿,结果在 Firefox 浏览器中复现了这个问题。而在 IE8 浏览器中,用两个标签页同时请求时,反而得到了预期的结果:两个请求是同时处理的。

这让我觉得问题可能和浏览器有关,而不是 web.py 本身的问题。很可能是一些浏览器会把对同一个网址或域名的请求排队,而不是一次性发送所有请求。

一个多线程或多进程的 Python 应用应该不会遇到同样的问题。

为了参考,这里是我根据基础教程制作的简单 web.py 应用:

#!/usr/bin/env python

import time, web

urls = (
  '/', 'index'
)

web.config.debug = False
app = web.application(urls, globals())

class index:
    def GET(self):
        time.sleep(10)
        return "Hello, world!"

if __name__ == "__main__":
    app.run()

撰写回答