首页 > 数据库 >Flask框架内容基础3 -- 使用redis实现异步任务队列

Flask框架内容基础3 -- 使用redis实现异步任务队列

时间:2024-07-31 16:52:56浏览次数:16  
标签:info task Flask REDIS redis -- tid data

前面所了解的所有请求都是同步的,那么当面临异步请求时,应该怎么做?

调用者:携带参数发送请求

API:接收请求并生成一个任务ID,接下来:返回给调用者+放到任务队列中

worker:等待redis队列(List),一旦接收到任务,就执行并将结果返回到结果队列(Hash)

调用者:等待n秒后,携带任务ID再次发送请求,获取结果

API:接收任务ID,根据ID去结果队列(Hash)中获取 

一、调用者调用逻辑代码:
import json
import uuid


import redis
from flask import Flask, jsonify, send_file, request

app = Flask(__name__)


@app.route('/task', methods=['POST'])
def task():
    task_str = request.json.get("order_string")
    # 生成任务id
    tid = str(uuid.uuid4())
    # 将任务放入任务队列中
    info_dict = {'tid': tid, 'data': task_str}
    # 连接redis
    REDIS_CONN_PARAMS = {
        "host": '127.0.0.1',
        'password': '123456',
        'port': 6379,
        'encoding': 'utf-8'
    }
    conn = redis.Redis(**REDIS_CONN_PARAMS)
    conn.lpush("spider_task_list",json.dumps(info_dict))
    return jsonify({'status': True, 'data': tid, 'message': "正在处理,预计等待1分钟"})


if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8080, debug=True)
二、工作者对任务队列任务进行处理 
import json
import uuid

import redis
from flask import Flask, jsonify, send_file, request


def get_task():
    REDIS_CONN_PARAMS = {
        "host": '127.0.0.1',
        'password': '123456',
        'port': 6379,
        'encoding': 'utf-8'
    }
    conn = redis.Redis(**REDIS_CONN_PARAMS)
    data = conn.brpop("spider_task_list", timeout=10)
    return json.loads(data[1].decode('utf-8'))


def set_result(tid, res_info):
    # 将处理结果放入结果队列
    REDIS_CONN_PARAMS = {
        "host": '127.0.0.1',
        'password': '123456',
        'port': 6379,
        'encoding': 'utf-8'
    }
    conn = redis.Redis(**REDIS_CONN_PARAMS)
    conn.hset("spider_result_list", tid, res_info)


def run():
    while True:
        # 1.去redis中获取任务
        # 连接redis
        task_info = get_task()
        if not task_info:
            continue
        # todo 处理任务
        res_info = ''
        tid = task_info['tid']
        set_result(tid, res_info)
三、调用者再次调用api获取处理好的结果:
@app.route('/result', methods=['GET'])
def result():
    # 根据任务id去结果队列中寻找
    tid = request.args.get('tid')
    if not tid:
        return jsonify({'status': False, 'error': '参数错误'})
    REDIS_CONN_PARAMS = {
        "host": '127.0.0.1',
        'password': '123456',
        'port': 6379,
        'encoding': 'utf-8'
    }
    conn = redis.Redis(**REDIS_CONN_PARAMS)
    data = conn.hget("spider_result_list", tid)

    if not data:
        return jsonify({"status": True, 'data': "", 'message': "未完成,请继续等待"})
    data_str = data.decode('utf-8')
    return jsonify({'status': True, 'data': data_str})

优化:上述在连接redis时遇到了与连接数据库时一样的问题,所以我们可以比葫芦画瓢,创建redis连接池。

REDIS_POOL = redis.ConnectionPool(host='127.0.0.1', password='123456', port=6379, encoding='utf-8', max_connections=100)

标签:info,task,Flask,REDIS,redis,--,tid,data
From: https://blog.csdn.net/m0_59362850/article/details/140735360

相关文章

  • H7-TOOL自制Flash读写保护算法系列,为国民技术N32G031制作读写使能和解除算法,支持在线
    说明:很多IC厂家仅发布了内部Flash算法文件,并没有提供读写保护算法文件,也就是选项字节算法文件,需要我们制作。实际上当前已经发布的TOOL版本,已经自制很多了。但是依然有些厂家还没自制,所以陆续开始为这些厂家提供读写保护支持。实现效果:本次添加国民技术的N32G031,从2.26版本开......
  • 加油,为Vue3提供一个可媲美Angular的ioc容器
    为什么要为Vue3提供ioc容器Vue3因其出色的响应式系统,以及便利的功能特性,完全胜任大型业务系统的开发。但是,我们不仅要能做到,而且要做得更好。大型业务系统的关键就是解耦合,从而减缓shi山代码的生长。而ioc容器是目前最好的解耦合工具。Angular从一开始就引入了ioc容器,因此在业务......
  • Python 中的多元回归
    我想在Python中基于多个相关数据数组和多个独立数据执行多元线性回归。我见过很多多重线性回归,具有多个独立输入,几乎每个人都认为多重=多元,但事实并非如此。我在互联网上看不到任何真正的多元教程。我想要的是多个输出+多个输入。frompandasimportDataFramefromsklear......
  • Seralizable
    classCSer{privateStringname;privateintage;publicCSer(){}publicCSer(Stringname,intage){this.name=name;this.age=age;}publicStringgetName(){returnname;}publicvo......
  • win10下WSL2子系统与winnfsd使用
    1安装WSL2子系统1.1下载安装进入windowsStore,搜索Ubuntu,下载:1.2开启依赖右键windows左下角->应用和功能->相关设置-程序和功能->启用或关闭windows功能。勾选适用于Linux的windows子系统和虚拟机平台(WSL2需要)选项:也可以直接在powershell中输入如下两条指令开启:dism......
  • 2024-07-31:用go语言,给定两个正整数数组arr1和arr2,我们要找到属于arr1的整数x和属于arr
    2024-07-31:用go语言,给定两个正整数数组arr1和arr2,我们要找到属于arr1的整数x和属于arr2的整数y组成的所有数对(x,y)中,具有最长公共前缀的长度。公共前缀是指两个数的最左边的一位或多位数字相同的部分。例如,对于整数5655359和56554来说,它们的公共前缀是565,而对于1223和43456来说......
  • .NET 开源的数据库文档查询和生成工具
    前言在实际项目开发中,需求变更和项目迭代是常态。要求我们能够迅速响应,对数据库结构进行相应的调整,如添加新表、更新现有表结构或增加字段等。为了确保团队成员之间的信息同步,实时更新和维护数据库文档变得至关重要。这不仅提升了数据库的可读性,也极大提高了开发效率和团队协作......
  • 使用这个Blender工具非破坏性地自动化切割面板线
    "PanelCutter"插件自动化了在Blender中沿选定边缘创建程序化面板线的过程,使其成为硬表面建模的必备工具。这是一个设计用来非破坏性地自动化切割程序化面板线的小工具。这个工具对于硬表面模型,如汽车、船只和飞机来说,是救星。现在你可以动态地分配面板切割,而无需将其建模到拓扑......
  • ROBOTIS DYNAMIXEL XC330-M288-T舵机介绍(中文)
     购买链接:淘宝:XC330-M288-T舵机LEAPHand机械手机器学习ROBOTIS原装进口-淘宝网(taobao.com)京东:ROBOTIS机器人舵机XC330-M181-T伺服电机LEAPHand机械手人工智能手掌机器学习机器人关节机械臂XC330-M288-T【图片价格品牌报价】-京东(jd.com)物品规......
  • 建议所有iPhone升级!苹果iOS 17.6正式版发布:重要错误修复
    苹果发布iOS17.6正式版升级,本次更新距离iOS17.5发布已有两个月时间。升级日志显示,iOS17.6提供重要的错误修复和安全性更新,苹果建议所有用户安装。不出意外的话,iOS17.6将是iOS17最后几次更新之一,后续将仅提供必须的安全更新和Bug修复,苹果的开发重心会转移到iOS18上。根据......