9

Flask教程(二十六)flask-executor

 1 year ago
source link: https://xugaoxiang.com/2021/12/27/flask-26-flask-executor/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

本篇介绍 flask 的另一个扩展,即 flask-executor,它将 python 中的 concurrent.futures 功能加到了 flask 中,使得我们在 flask 中使用任务队列变得非常的方便。

直接使用 pip 安装

pip install flask-executor

下面这个例子来自官方,模拟的是用户在网站注册账号时,网站发送电子邮件到用户邮箱的动作,看下面的代码

from flask import Flask
from flask_executor import Executor

app = Flask(__name__)

# 实例化
executor = Executor(app)

def send_email(recipient, subject, body):
    # 模拟邮件发送动作
    print('send mail.')
    return True

@app.route('/signup')
def signup():
    # 将任务send_email放进任务池中
    executor.submit(send_email, "[email protected]", "subject", "body")
    return "signup done."

if __name__ == '__main__':
    # 启动服务
    app.run('0.0.0.0', debug=True, port=5000)

代码部分没什么可解释的,flask-executor 与其它扩展的使用方法一样。通过方法 submit 将任务放进任务池中,依次执行。

默认情况下,flask-executor 使用的是线程池,可以通过设置 EXECUTOR_TYPE 来指定使用进程池

# 值为 process 或者 thread
app.config['EXECUTOR_TYPE'] = 'process'

除了 executor 的类型,还有个值非常重要,就是池子的大小。可以通过设置 EXECUTOR_MAX_WORKERS 来指定

app.config['EXECUTOR_MAX_WORKERS'] = 10

flask-executor 提供了装饰方法的方法,看下面示例

@executor.job
def fib(n):
    if n <= 2:
        return 1
    else:
        return fib(n-1) + fib(n-2)

@app.route('/decorate_fib')
def decorate_fib():
    fib.submit(5)
    return 'OK'

concurrent.futures.Future 对象可以通过方法 add_done_callback 来绑定回调,来看下面代码片段

def callback(future):
    print('callback')

@app.route('/signup')
def signup():
    executor.add_default_done_callback(callback)
    executor.submit(send_email, "[email protected]", "subject", "body")
    return "signup done."

send_email 完成后,回调函数 callback 就会被执行

https://github.com/xugaoxiang/FlaskTutorial

Flask系列教程

更多Flask教程,请移步

https://xugaoxiang.com/category/python/flask/


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK