Flask 应用在处理请求时挂起

6 投票
2 回答
11421 浏览
提问于 2025-04-17 21:46

我有一个简单的Flask应用,只有一页,用户可以上传HTML文件,然后在POST请求时对其进行一些处理。处理的时候,我使用了BeautifulSoup和Pandas,通常需要5到10秒才能完成任务。

最后,我把处理后的数据导出到Excel文件中,如果之前有存储的Excel文件,就会更新它。在GET请求时,我会返回这个数据的结果。

现在的问题是……在这5到10秒的处理时间里,应用没有任何响应;即使我从另一台电脑访问我的应用,也要等到这5到10秒完成后才能看到结果。这就意味着,如果有用户上传了文件,其他用户就得等到这个用户的任务完成才能继续使用应用。

我甚至在我的应用中添加了下面提到的代码,但没有任何改善。

from tornado.wsgi import WSGIContainer
from tornado.httpserver import HTTPServer
from tornado.ioloop import IOLoop

if __name__ == '__main__':
    http_server = HTTPServer(WSGIContainer(app))
    http_server.listen(5657)
    IOLoop.instance().start()

另外,我的系统和Python版本如下……

>>> sys.version
'2.7.5 |Anaconda 1.8.0 (32-bit)| (default, Jul  1 2013, 12:41:55) [MSC v.1500 32 bit (Intel)]'

注意:我想把它迁移到Python 3.3,并且希望继续使用我的Windows 7机器!!

2 个回答

1

如果你在使用WSGI的run_simple函数,只需要加上 threaded=true 这个参数就可以了。

示例:

run_simple('0.0.0.0', 9370, application, use_reloader=True, use_debugger=True, threaded=True)
15

Tornado 通常是一个单线程的网络服务器。如果你专门为 Tornado 的异步风格编写代码,你可以同时处理多个请求。但在你的情况下,你并没有这样做;你只是用 Tornado 来逐个处理 Flask 的请求。

可以考虑去掉 Tornado,试试 Flask 的多线程选项:

app.run(threaded=True)

撰写回答