celery & flower

Celery 的使用场景

  异步任务:将耗时操作任务提交给Celery去异步执行。
  定时任务:比如每日数据统计

 

Celery 的基本结构

 

 

 

task producer:任务生产者,产生任务并交给任务队列

celery beat:任务调度器,周期性地将配置中需要执行的任务发送给任务队列(定时任务)

borker:任务队列,介于生产者和消费者的中间人,就是生产者存放和消费者拿取任务的地方

celery 本身不提供队列服务,一般用 redis 来充当 broker 的角色

worker:任务消费者,它会实时监控队列,如果有任务就拿出来执行

result:储存任务结果的地方

 

import time
from celery import Celery
from celery import group

# 配置celery backend and broker
broker = "redis://localhost:6379/14"
backend = 'redis://localhost:6379/15'
# 创建Celery实例
app = Celery('my_task', broker=broker, backend=backend)


@app.task
def add(x, y):
    print('enter func...')
    time.sleep(5)  # 模拟耗时操作
    return x + y


@app.task(trail=True)
def A(how_many):
    return group(B.s(i) for i in range(how_many))()


@app.task(trail=True)
def B(i):
    return pow2.delay(i)


@app.task(trail=True)
def pow2(i):
    return i ** 2

 

import time
from celery.result import ResultBase

import task_1


def trigger():
    t1 = time.time()
    print('start task...')
    print(task_1.add.name)
    data = task_1.add.delay(4, 11)  # 这里需要用 celery 提供的接口 delay 进行调用
    print('end task...')
    t2 = time.time()
    print('共耗时:%s' % str(t2 - t1))



def trigger1(num: int):
    print("tringger1 ...")
    result_1 = task_1.A.delay(num)
    for v in result_1.collect():
        print(v)



if __name__ == '__main__':
    # celery worker -A task_1 -l INFO -E &
    # celery flower --port=555 --broker=redis://127.0.0.1:6379/14
    trigger()
    trigger1(11)

 

posted @ 2021-03-10 13:49  薄荷味日记  阅读(116)  评论(0编辑  收藏  举报