使用芹菜节拍在多个时间(使用不同参数)安排任务但任务仅运行一次(使用随机参数)

时间:2016-11-09 12:58:57

标签: python-3.x celery scheduler celery-task celerybeat

我想要实现的目标 编写一个调度程序,它使用数据库在不同的时间安排类似的任务。

对于我使用芹菜节拍的相同,下面的代码片段会给出一个想法

try:
    reader = MongoReader()
except:
    raise
try:
    tasks = reader.get_scheduled_tasks()
except:
    raise
celerybeat_schedule = dict()
for task in tasks:
    celerybeat_schedule[task["task_id"]] =dict()
    celerybeat_schedule[task["task_id"]]["task"] = task["task_name"]
    celerybeat_schedule[task["task_id"]]["args"] = (task,)
    celerybeat_schedule[task["task_id"]]["schedule"] = get_task_schedule(task)

app.conf.update(BROKER_URL=rabbit_mq_endpoint, CELERY_TASK_SERIALIZER='json', CELERY_ACCEPT_CONTENT=['json'], CELERYBEAT_SCHEDULE=celerybeat_schedule)

所以这些是三个步骤 - 从数据存储区读取所有任务 - 创建一个字典,芹菜调度程序,由所有具有属性的任务填充,task_name(将运行的方法),参数(传递给方法的数据),调度(存储何时运行) - 用芹菜配置更新这个

预期方案 给定所有条目运行相同的芹菜任务名称,只需打印,每5分钟运行相同的计划,具有指定要打印的内容的不同参数,让我们说db有

task name     , parameter , schedule
regular_print , Hi        , {"minutes" : 5}
regular_print , Hello        , {"minutes" : 5}
regular_print , Bye        , {"minutes" : 5}

我希望,这些打印每5分钟打印三次

会发生什么 Hi,Hello,Bye中只有一个打印(可能是随机的,肯定不是按顺序)

请帮忙, 非常感谢提前:)

1 个答案:

答案 0 :(得分:0)

能够使用芹菜的第4版来解决这个问题。类似于对我有用的样本..也可以在celery的文档中找到版本4

    #taking address and user-pass from environment(you can mention direct values) 
    ex_host_queue = os.environ["EX_HOST_QUEUE"]
    ex_port_queue = os.environ["EX_PORT_QUEUE"]
    ex_user_queue = os.environ["EX_USERID_QUEUE"]
    ex_pass_queue = os.environ["EX_PASSWORD_QUEUE"]
    broker= "amqp://"+ex_user_queue+":"+ex_pass_queue+"@"+ex_host_queue+":"+ex_port_queue+"//"

    #celery initialization
    app = Celery(__name__,backend=broker, broker=broker)
    app.conf.task_default_queue = 'scheduler_queue'
    app.conf.update(
        task_serializer='json',
        accept_content=['json'],  # Ignore other content
        result_serializer='json'
    )
task = {"task_id":1,"a":10,"b":20}
##method to update scheduler
def add_scheduled_task(task):
    print("scheduling task")
    del task["_id"]
    print("adding task_id")
    name = task["task_name"]
    app.add_periodic_task(timedelta(minutes=1),add.s(task), name = task["task_id"])    

@app.task(name='scheduler_task')
def scheduler_task(data):
    print(str(data["a"]+data["b"]))