我使用 Flask 微框架实现了一个多线程 Web 服务器。基本上,我的服务器有一个任务队列和一个线程池。因此,它可以处理多个请求。由于 Flask 是用 Python 实现的,并且 Python 线程不是真正并发的,所以我的 Web 应用程序有点滞后。
Flask 是否有任何替代品来克服多线程问题?
我使用 Flask 微框架实现了一个多线程 Web 服务器。基本上,我的服务器有一个任务队列和一个线程池。因此,它可以处理多个请求。由于 Flask 是用 Python 实现的,并且 Python 线程不是真正并发的,所以我的 Web 应用程序有点滞后。
Flask 是否有任何替代品来克服多线程问题?
我遇到了这个问题,我有点失望,没有人指出烧瓶(以及大多数 python 网络应用程序是要部署的)。见: http: //flask.pocoo.org/docs/deploying/#deployment
我首选的部署选项是超级简单的Tornado ,它在 Linux和Windows上同样适用(如果我将它与现有网站一起部署,或者甚至将混合部署作为现有网站的一部分,我通常使用 IIS 应用程序请求路由 [ARR]作为 Tornado 的反向代理)。我也在两者上都使用了 gevent 并取得了巨大的成功。
Tornado 是可扩展、非阻塞的 Web 服务器和工具的开源版本,为 FriendFeed 提供支持。因为它是非阻塞的并且使用 epoll,它可以同时处理数千个站立连接,这意味着它非常适合实时 Web 服务。将此服务与 Flask 集成很简单:
因此,如果您的烧瓶应用程序位于 yourapplication.py 中,您可能会创建另一个名为 tornado_web.py 的应用程序,并使用它来为您的应用程序提供服务,如下所示:
from tornado.wsgi import WSGIContainer
from tornado.httpserver import HTTPServer
from tornado.ioloop import IOLoop
from yourapplication import app
http_server = HTTPServer(WSGIContainer(app))
http_server.listen(5000)
IOLoop.instance().start()
通过: http: //flask.pocoo.org/docs/deploying/wsgi-standalone/#tornado
这不是 Flask 的错,它是 Python 解释器的一个限制,所以你使用的任何框架都会受到它的影响。
但是有一个很好的方法可以避免这个问题。要获得真正的并发,您可以使用进程池而不是线程。multiprocessing模块提供了一个与 threading 模块兼容的API,但它为工作线程创建子进程。我已经使用这个模块为 Flask 应用程序创建后台工作程序,并且发现它工作得很好。
现在趋势中有一个新的包,它对生产也很健壮,它是用 python 实现的,而且很容易理解。请看一看。 快速API