Flask应用程序在处理请求时挂起。

6
我有一个简单的Flask应用程序,是单页的上传HTML文件,然后在POST请求上对其进行一些处理;我使用beautifulsoup和pandas,在通常情况下需要5-10秒才能完成任务。

最终,我使用pandas将结果数据框导出到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)]'

注意:我想将它移植到Python3.3,并希望仍然在我的Windows 7机器上使用!
2个回答

15

Tornado通常是一个单线程的Web服务器。如果您专门为Tornado的异步风格编写代码,您可以并发处理多个请求,但在您的情况下,您只是使用Tornado一次为Flask服务请求。

删除Tornado并尝试使用Flask的多线程选项:

app.run(threaded=True)

@Jesse:现在它正在工作... 我也尝试在Windows上设置processes=10,但它停在了os.fork();好吧,那我必须将我的应用程序移动到更好的替代方案,比如Linux机器; 这样,我需要指定进程数吗??所以有没有办法让我的应用程序在每个新请求时自动添加新进程?? - namit
1
请参阅此处的 run_simple 文档:http://werkzeug.pocoo.org/docs/serving/#werkzeug.serving.run_simple 所有传递给 app.run 的参数都会传递给 run_simple。在 Windows 上,请使用多线程。在 Linux 上,请使用多个线程和/或进程。 - A. Jesse Jiryu Davis

1
如果您正在使用WSGI的run_simple函数,只需添加threaded=true参数即可。
例子:
run_simple('0.0.0.0', 9370, application, use_reloader=True, use_debugger=True, threaded=True)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接