Flask asyncio 异步处理请求

2022-08-19 21:43:19 浏览数 (1)

来自:

​​​​​​Making Flask async and Quart sync (pgjones.dev)

示例:

代码语言:javascript复制
from flask import Flask, jsonify, has_request_context, copy_current_request_context, requestfrom functools import wrapsfrom concurrent.futures import Future, ThreadPoolExecutorimport asyncio def run_async(func):    @wraps(func)    def _wrapper(*args, **kwargs):        call_result = Future()        def _run():            loop = asyncio.new_event_loop()            try:                result = loop.run_until_complete(func(*args, **kwargs))            except Exception as error:                call_result.set_exception(error)            else:                call_result.set_result(result)            finally:                loop.close()         loop_executor = ThreadPoolExecutor(max_workers=1)        if has_request_context():            _run = copy_current_request_context(_run)        loop_future = loop_executor.submit(_run)        loop_future.result()        return call_result.result()     return _wrapper   @app.route("/process/report/success/", methods=["POST"])@run_asyncasync def report_result_success():    account = request.json    print(request.json)    debug('>> 注册成功: '   str(account))    write_csv(account, '成功.csv')    return Result.ok()

水话:

        像Flask这样的Web框架是异步编程技术的完美用例,因为它们的目的是处理独立的无状态请求。此外,Web框架通常由IO而不是CPU工作主导,这使得它们成为异步事件循环的明显用例。

        因此,Flask 通常与线程或事件循环一起使用。具体来说,非异步等待事件循环实现、eventlet、gevent 和 meinheld。异步解决方案之间的这种选择对 Flask 代码的影响非常小。

        Flask自成立以来一直处于同步状态,并且大量公司以这种方式成功地在生产中运行它。然而,Python已经在标准库中发展并正式化了一个基于异步等待的事件循环,即asyncio,社区又增加了两个Curio和Trio。这些基于异步等待的事件循环需要更改代码才能与事件循环交互

0 人点赞