解決同時多個請求的處理問題,和定時任務


 

 應用場景:

發布系統:讓他晚上2點執行發布的一串任務  定時任務

更新訪問量: 晚上2點定時將數據從redis更新到mysql中去

商城類的搶購工作:大批量的用戶涌入,承載不了一次性處理這么多的活兒,用這個方式也可以

 

 

 

 

 

 目錄結構

 

1.讓woker運行

注意要pip install selery==3.1.1??

windos下如何啟動

2.運行flask

3.創建任務

創建任務是立即創建成功的  對用戶友好,意思是能馬上看到我的任務被創建了 如下

 

 

 4.查看詳情

(拿到隨機字符串去檢測是否成功)

 

終止功能的參數

 創建一個終止的功能

 

 

如何配置定時任務

 

代碼:見老師的  01_celery(技術分享)

 

 目錄結構

 

代碼

celery.py   

from celery import Celery
from celery.schedules import crontab

cel = Celery(
    'tasks',
    broker='redis://127.0.0.1:6379',
    backend='redis://127.0.0.1:6379',
    include=['celery_tasks.s1','celery_tasks.s2']
)
View Code

 s1.py

from .celery import cel

@cel.task
def hello1(*args, **kwargs):
    return "hello1"
View Code

s2.py

from .celery import cel

@cel.task
def hello2(*args, **kwargs):
    return "hello2"
View Code

 

app.py  調用celery中的內容,處理請求

import datetime
from flask import Flask,request,render_template,redirect
from celery.result import AsyncResult
from celery_tasks.celery import cel
from celery_tasks.s1 import hello1


app = Flask(__name__)

TASK_LIST = [

]

@app.route('/index')
def index():
    """
    任務列表
    :return:
    """
    return render_template('index.html',tasks= TASK_LIST)

@app.route('/add_task',methods=['GET','POST'])
def add_task():
    if request.method == 'GET':
        return render_template('add_task.html')
    else:
        title = request.form.get('title')

        # 在celery中添加一個任務
        ctime = datetime.datetime.now()
        utc_ctime = datetime.datetime.utcfromtimestamp(ctime.timestamp())
        ctime_x = utc_ctime + datetime.timedelta(seconds=10)

        # 在celery中添加任務 執行一個定時任務,
        result = hello1.apply_async(args=[1, 3], eta=ctime_x)
        
        TASK_LIST.append({'id':result.id,'title':title})

        return redirect('/index')

@app.route('/status')
def status():
    #查看任務狀態的功能
    id = request.args.get('id')
    # 根據id查看任務狀態
    try:
        async = AsyncResult(id=id, app=cel)
        # async.revoke(terminate=True)  # 無論現在是什么時候,都要終止
        # async.revoke(terminate=False) # 如果任務還沒有開始執行呢,那么就可以終止。
        if async.successful():
            result = async.get()
            return "執行完成,結果是:%s" %(result,)
            # async.forget() # 將結果刪除
        elif async.failed():
            return '執行失敗'
        elif async.status == 'PENDING':
            return '任務等待中被執行'
        elif async.status == 'RETRY':
            return '任務異常后正在重試'
        elif async.status == 'STARTED':
            return '任務已經開始被執行'
    except Exception as e:
        return "執行異常"

@app.route('/status')
def revoke():
    #終止功能
    id = request.args.get('id')
    # 根據id查看任務狀態
    async = AsyncResult(id=id, app=cel)
    async.revoke(terminate=True)  # 無論現在是什么時候,都要終止
    return '已經終止'

if __name__ == '__main__':
    app.run()

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM