Celery

1. 发布简单的任务流程(celery+redis)

(1)pip3 install celery

(2)任务文件tasks.py
import subprocess
from time import sleep
from celery import Celery

app = Celery('tasks',
             broker='redis://localhost',
             backend='redis://localhost',
            )

@app.task
def add(x, y):
    print("running...", x, y)
    return x + y

@app.task
def run_cmd(cmd):
    print("run ...%s" %cmd)
    sleep(5)
    cmd_obj =subprocess .Popen (cmd,shell=True,
                                stdout= subprocess .PIPE ,
                                stderr= subprocess .PIPE )
    return cmd_obj.stdout .read().decode('utf-8')  # 保证结果可进行序列化

'''
在当前目录开启celery服务
celery -A tasks worker --loglevel=info

注:win10上运行celery4.x会出现问题 要安装eventlet
celery -A tasks worker --loglevel=info -P eventlet

celery -A tasks worker --loglevel=debug  错误信息
'''

(3)启动celery 服务(在当前任务文件内执行)
celery -A tasks worker --loglevel=info

(4) 执行任务
t1.py
from tasks import add
# delay 将任务发到worker执行
res=add.delay(4,4)
print(res.get())  # 取值
print(res)

t2.py
from tasks import run_cmd
r=run_cmd.delay('dir')
print(r.get())

学习地址:
https://www.cnblogs.com/alex3714/p/6351797.html

2. 定时任务

periodic_task.py

# coding:utf-8

# 拒绝隐式引入,因为celery.py的名字和celery的包名冲突,需要使用这条语句让程序正确地运行
from __future__ import absolute_import
from celery import Celery
from celery.schedules import  crontab

app = Celery ()
@app.on_after_configure .connect
def setup_periodic_tasks(sender,**kwargs ):
    # 每隔10秒打印hello
    sender .add_periodic_task(10.0,test.s('hello'),name='add every 10')

    # 隔30秒打印world
    sender.add_periodic_task (30.0,test.s('world'),expires=10)

    # 每周一早上7:30 执行
    sender.add_periodic_task (
        crontab(hour=7,minute= 30,day_of_week=1),
        test.s('Happy Mondays')

    # sender .add_periodic_task (10.0,add.s(3,4))
    )
    
@app.task
def test(arg):
    print(arg)

@app.task
def add(x, y):
    print(x+y)
    return x + y

app.conf.beat_schedule={
'add-every-30-seconds':{
    'task':'add',
    # 'schedule':20.0, # 每20秒调用tasks.add
    "schedule": crontab(minute="*/1"), # 每分钟执行
    'args':(16,16)
},
}
app.conf.timezone = 'UTC'

'''
发布任务:
celery -A periodic_task beat

执行任务:
celery -A periodic_task worker -P eventlet

合并:worker和beat一起启动
celery -B -A periodic_task worker --loglevel=info
'''

# https://blog.csdn.net/Shyllin/article/details/80940643
上一篇:「CF803G Periodic RMQ Problem」


下一篇:MVC下载文件方式