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

 

 應用場景:

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

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

商城類的搶購工做:大批量的用戶涌入,承載不了一次性處理這麼多的活兒,用這個方式也能夠redis

 

 

 

 

 

 目錄結構

 

1.讓woker運行

注意要pip install selery==3.1.1??sql

windos下如何啓動flask

2.運行flask

3.建立任務

建立任務是當即建立成功的  對用戶友好,意思是能立刻看到個人任務被建立了 以下app

 

 

 4.查看詳情

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

 

終止功能的參數

 建立一個終止的功能

 

 

如何配置定時任務

 

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

 

 目錄結構spa

 

代碼3d

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()
相關文章
相關標籤/搜索