欢迎访问我的网站,希望内容对您有用,感兴趣的可以加入我们的社群。

Flask教程(二十三)简单异步任务

Flask Web 迷途小书童 4年前 (2020-11-15) 6631次浏览 3个评论

软硬件环境

  • windows 10 64bit
  • anaconda3 with python 3.7
  • flask 1.1.2

视频看这里

此处是 youtube 的播放链接,需要科学上网。喜欢我的视频,请记得订阅我的频道,打开旁边的小铃铛,点赞并分享,感谢您的支持。

前言

Python 3.2开始,标准库为我们提供了 concurrent.futures 模块,它提供了 ThreadPoolExecutor (线程池)和 ProcessPoolExecutor (进程池)两个类。使用 submit 方法来提交线程(或进程)需要执行的任务到线程(进程)池中,并返回该任务的句柄,submit 不是阻塞的,而是立即返回。通过任务句柄的 done() 方法来判断该任务是否结束,通过 result() 方法可以获取任务的返回值。

结合 concurrent.futures 模块,可以在 flask 应用中实现简单异步任务。

代码实现

直接来看代码吧

from flask import Flask
import time
from concurrent.futures import ThreadPoolExecutor

executor = ThreadPoolExecutor(2)

app = Flask(__name__)

@app.route('/tasks')
def run_background_tasks():
    # 提交2个任务,一个带参、一个不带参
    executor.submit(background_task1)
    executor.submit(background_task2, 'hello', 'future')
    return 'tasks started in background!'

def background_task1():
    print("background_task1 started!")
    time.sleep(10)
    print("background_task1 done!")

def background_task2(arg1, arg2):
    print(f"background_task2 started with args: {arg1} {arg2}!")
    time.sleep(5)
    print("background_task2 done!")

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000, debug=True)

启动 flask 服务后,访问 http://127.0.0.1:5000/tasks,观察终端的打印输出

flask_future

源码下载

https://github.com/xugaoxiang/FlaskTutorial

Flask教程专题

更多 Flask 教程,请移步

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

参考资料

喜欢 (1)

您必须 登录 才能发表评论!

(3)个小伙伴在吐槽
  1. 感谢博主。简单粗暴高效解决了我请求任务中一个耗时问题
    匿名2021-09-14 11:07
  2. 请问,为什么启动程序之后没有请求,但是先输出了两条start 的日志
    匿名2021-09-10 11:49