Python 使用flask应用程序运行tornado web服务器并检查异步请求处理

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

我试图在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(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应用程序会导致性能非常差。文件中甚至有关于这件事的详细说明。