Python 使用flask应用程序运行tornado web服务器并检查异步请求处理
我试图在tornado服务器上运行flask应用程序来检查异步请求处理。我有两个文件“flask_req.py”和“tornado_ex.py”。我的两个文件如下所示: 烧瓶规格Python 使用flask应用程序运行tornado web服务器并检查异步请求处理,python,flask,tornado,Python,Flask,Tornado,我试图在tornado服务器上运行flask应用程序来检查异步请求处理。我有两个文件“flask_req.py”和“tornado_ex.py”。我的两个文件如下所示: 烧瓶规格 from flask import Flask from flask import request app = Flask(__name__) @app.route('/hello',methods=['GET']) def hello(): print "hello 1" time.sleep(2
from flask import Flask
from flask import request
app = Flask(__name__)
@app.route('/hello',methods=['GET'])
def hello():
print "hello 1"
time.sleep(20)
x= 2*2
print(x)
return "hello"
@app.route('/bye',methods=['GET'])
def bye():
print "bye 1"
time.sleep(5)
y = 4*4
print(y)
return "bye"
龙卷风
from __future__ import print_function
from tornado.wsgi import WSGIContainer
from tornado.web import Application, FallbackHandler
from tornado.websocket import WebSocketHandler
from tornado.ioloop import IOLoop
from tornado import gen
from tornado.httpclient import AsyncHTTPClient
import time
from flask_req import app
class WebSocket(WebSocketHandler):
def open(self):
print("Socket opened.")
def on_message(self, message):
self.write_message("Received: " + message)
print("Received message: " + message)
def on_close(self):
print("Socket closed.")
@gen.coroutine
def fetch_and_handle():
"""Fetches the urls and handles/processes the response"""
urls = [
'http://127.0.0.1:8080/hello',
'http://127.0.0.1:8080/bye'
]
http_client = AsyncHTTPClient()
waiter = gen.WaitIterator(*[http_client.fetch(url) for url in urls])
while not waiter.done():
try:
response = yield waiter.next()
except Exception as e:
print(e)
continue
print(response.body)
if __name__ == "__main__":
container = WSGIContainer(app)
server = Application([
(r'/websocket/', WebSocket),
(r'.*', FallbackHandler, dict(fallback=container))
])
server.listen(8080)
fetch_and_handle()
IOLoop.instance().start()
我想检查使用tornado服务器处理请求的异步行为。现在,当我运行它时,当两个URL都被传递时,它将等待20秒+5秒=25秒。我想这样运行它,如果一个请求需要时间,那么它应该处理另一个请求,这样从上面的代码来看,它应该需要的总等待时间只有20秒,而不是25秒。我如何在这里实现这种行为。现在,当我运行上述代码时,我得到的响应如下:
$ python tornado_ex.py
hello 1
4
bye 1
16
hello
bye
在打印“hello1”后,它等待25秒,然后进行进一步处理,在打印“bye1”后,它再次等待5秒。我想要的是在打印“hello1”之后,如果它花费了这么多时间,那么它应该处理“/bye”。使用WSGI容器意味着一次只处理一个请求,并且在第一个请求完成之前不会处理后续请求 当您需要并发时,使用Tornado运行WSGI应用程序通常不是一个好主意
使用多个进程或将您的项目转换为使用异步tornado web framework而不是WSGI。您能告诉我在使用异步tornado web framework的代码中应该做哪些更改吗?为此,您确实需要正确阅读tornado web文档并通过其示例来解决。好的,谢谢您的帮助:)Flask不是异步的,所以要服务多个请求,它需要多个线程。但龙卷风是单线程的。所以在Tornado上运行Flask应用程序会导致性能非常差。文件中甚至有关于这件事的详细说明。