首页 > 其他分享 >【web服务】耗时任务基于API与worker模式

【web服务】耗时任务基于API与worker模式

时间:2024-10-15 21:21:53浏览次数:5  
标签:__ web task res worker API dict result id

  • 场景:当我们爬虫或者获取数据需要很长的时间计算或者等待,这种情况情况下基于API与worker模式完成交付
  • 1.API端:用flask框架
import json
import uuid
import redis
from flask import Flask, request, jsonify

app = Flask(__name__)
pool = redis.ConnectionPool(host='127.0.0.1', port=6379, password='123456',encoding='utf-8', max_connections=1000)

@app.route("/task",method=["POST"])
def task():
    # 构建参数
    total_dict = {}
    user_dict = request.json
    total_dict.update(user_dict)
    total_dict.update({"token":"1231312","sign":"dsfewfwef"})

    # 创建任务ID
    task_id = str(uuid.uuid4())

    # 放入redis
    conn = redis.Redis(connection_pool=pool)
    task_info = {"uid":task_id,"info":total_dict}
    conn.lpush("task_queue",json.dumps(task_info))

    return jsonify({"status":True,"data":task_id})

@app.route("/fetch",method=["GET"])
def fetch():
    # 通过url传递任务id
    task_id = request.args.get("task_id")
    conn = redis.Redis(connection_pool=pool)
    result = conn.hget("task_result",task_id)
    if not result:
        return jsonify({"status":False,"data":"任务还在执行中"})

    conn.hdel("task_result",task_id)
    result_string = result.decode('utf-8')
    return jsonify({"status":True,"data":result_string})

if __name__ == '__main__':
    app.run(host="127.0.0.1", port=9999)

  • 2.客户端
import time

import requests

# 1.发送请求(创建任务)
res = requests.post(
    url="http://127.0.0.1:9999/task",
    json={
        "aid": 1,
        "bfc": True,
        "ctime": int(time.time())
    }
)
# {"status": True, "data": "fa5d4f0d-9d29-4008-8097-d1a7d5f9c2cd"}
res_dict = res.json()
task_id = res_dict['data']

# 2.查询结果
while True:
    time.sleep(5)
    res = requests.get(
        url="http://127.0.0.1:9999/fetch",
        params={
            "task_id": task_id
        }
    )
    # {"status": False, "data": "任务还在执行中"}
    # {"status": True, "data": result_string}
    res_dict = res.json()
    if not res_dict['status']:
        print(res_dict['data'])
        continue

    print("执行完毕", res_dict['data'])
    break
  • 3.worker
import random
import time

import redis
import json

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

def run():
    while True:
        conn = redis.Redis(connection_pool=POOL)
        res = conn.brpop(["task_queue"], timeout=30)  # ("task_queue",b"{}")
        print("取任务:", res)
        if not res:
            continue
        task_dict = json.loads(res[-1].decode('utf-8'))
        task_id = task_dict['uid']

        # 根据任务信息去执行任务,耗时:5分钟、1小时
        time.sleep(random.randint(5, 10))

        # 结算结果放入结果队列
        conn = redis.Redis(connection_pool=POOL)
        conn.hset("task_result", task_id, "执行结果")
"""
redis = {
	"task_result":{
		"fa5d4f0d-9d29-4008-8097-d1a7d5f9c2cd":"执行结果",
		"fa5d4f0d-9d29-4008-8097-d1a7d5f9c3cd":"执行结果",
	}
}
"""


if __name__ == '__main__':
    run()
  • 4.运行效果

  • 5.此场景适用于计算密集型与长时间耗时任务,我们将API部署在远程服务器上,使用本地电脑当做worker,可以节约成本

标签:__,web,task,res,worker,API,dict,result,id
From: https://www.cnblogs.com/xwltest/p/18468502

相关文章

  • 基于web的医疗设备管理系统
    开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:Maven3.3.9浏览器:谷歌浏览器后台路径地址:localhost:8080/项目名称/admin/dist/index.html前台路径地址:localhost:80......
  • 【JavaWeb】一文读懂Cookie、Session&Token 的区别和联系
    大佬精心打造:JavaWeb进阶学习资料》》点击免费获取【javaWeb】Cookie&Session&SpringSession原理分析简介Cookie、Session、Token这三者是不同发展阶段的产物,都是为了解决无状态的HTTP协议,提升网站的交互体验。但是他们各有优缺点,三者也没有明显的对立关系,反而常常......
  • 【JavaWeb】Spring Boot中@Import多种使用方式
    @Import是一个非常有用的注解,它的长处在于你可以通过配置来控制是否注入该Bean,也可以通过条件来控制注入哪些Bean到Spring容器中。比如我们熟悉的:@EnableAsync 、@EnableCaching、@EnableScheduling等等统一采用的都是借助@Import注解来实现的。  需要注意的是:ImportSele......
  • 彩云天气API 获取实时及当日天气等内容
    importrequests#用户输入的秘钥和经纬度(以逗号分隔)api_key=""#这里输入用户自己的秘钥location=""#输入用户的经纬度#抓取天气信息的函数defget_weather_info(api_key,location):try:#实时天气APIrealtime_url=f"https://api.ca......
  • C++使用MySQL官方的C API访问MySQL数据库
    这篇文章是一个简单的C++使用MySQL官方的CAPI访问MySQL数据库的代码示例。//main.h#ifndef_H_#define_H_#include<stdio.h>#include<Windows.h>#include<mysql.h>#pragmacomment(lib,"libmysql.lib")#defineinsert_prepare"insertintotest_tbvalue......
  • 【攻防世界】Web_python_template_injection
    Web_python_template_injection:python模板漏洞python的flask模板注入的题思路比较固定,Jinja2模板引擎中,{{}}是变量包裹标识符。{{}}并不仅仅可以传递变量,还可以执行一些简单的表达式。1.先判断是否存在注入{{config}}2.获取基本类:{{''.__class__.__mro__}}.__class......
  • nginx web代理
    目录1.nginx的简单介绍2.正向代理的应用场景2.1做访问控制 2.2审计 2.3负载分散2.4隐私保护和匿名性3.反向代理的应用场景如下 3.1.负载均衡2.缓存静态内容3.压缩和优化内容4.提供故障转移5.安全性和匿名性4.正向代理 4.1web端4.2lb01代理服务器配置 5.反......
  • DAY50WEB 攻防-PHP 应用&文件包含&LFI&RFI&伪协议编码算法&无文件利用&黑白盒
    知识点:1、文件包含-原理&分类&危害-LFI&RFI2、文件包含-利用-黑白盒&无文件&伪协议文件包含-原理&分类&利用&修复原理:程序开发人员通常会把可重复使用的函数写到单个文件中,在使用某些函数时,直接调用此文件,而无须再次编写,这种调用文件的过程一般被称为文件包含。在包含文......
  • Recaptcha3 协议识别 API 对接说明
    Recaptcha3协议识别API对接说明本文将介绍一种Recaptcha3协议识别API对接说明,它可让用户无需识别和点选Recaptcha3验证码图片,仅需通过提交WebsiteKey即可实现后台自动解码,完成验证。接下来介绍下Recaptcha3协议识别API的对接说明。注册链接点击链接注册......
  • 五官定位 API 对接说明
    五官定位API对接说明本文将介绍一种五官定位API对接说明,它可以通过输入图片,对请求图片进行五官定位(也称人脸关键点定位),计算构成人脸轮廓的90个点,包括眉毛(左右各8点)、眼睛(左右各8点)、鼻子(13点)、嘴巴(22点)、脸型轮廓(21点)、眼珠[或瞳孔](2点)。接下来介绍下五官......