如何为WebApp2添加多线程支持?

1 投票
1 回答
581 浏览
提问于 2025-04-17 19:20

我正在使用 Python 2.7 和 WebApp2,刚接触这两个东西。我是在 App Engine 之外运行 WebApp2,并且正在按照官方教程进行学习。

提供的 HelloWorld 示例使用了 Paste 网络服务器,运行得很好。但是如果我这样修改它(加了一些睡眠时间):

import webapp2

class HelloWebapp2(webapp2.RequestHandler):
    def get(self):
        import time
        time.sleep(6)
        self.response.write('Hello, webapp2!')

app = webapp2.WSGIApplication([
    ('/', HelloWebapp2),
], debug=True)

def main():
    from paste import httpserver
    httpserver.serve(app, host='127.0.0.1', port='8080', use_threadpool=True)

if __name__ == '__main__':
    main()

然后同时打开几个标签页,就明显感觉到这个 HelloWorld 是在一个线程里运行的。我加上 use_threadpool=True 只是为了显示更多信息,按照我从 Paste 文档中了解到的,它应该即使没有线程池也会使用多线程。

我试着在网上查找,但不幸的是,我得到的结果是“当 webapp2_extras.local 模块可用时,webapp2 是线程安全的”。这对我一点帮助都没有。

请教我如何修改这个 HelloWorld 以异步方式处理请求吧!

附带问题:如果我使用 Go 语言,能否直接在每个处理程序中运行 goroutine 来实现基本的并发?还是说 goroutine 只应该用于小函数?因为我还没有完全决定要用 Python,所以我在考虑其他选择。

补充:我发现问题出在 Google Chrome,而不是 Python。在其他浏览器中,一切都按预期工作,所以这个示例实际上已经在多个线程中运行了。不过,我不知道该如何在这里关闭这个问题。

1 个回答

0

你需要在你的 app.yaml 文件中添加以下标记:

threadsafe: yes

可以参考 这个链接

撰写回答