我想要实现的目标 编写一个调度程序,它使用数据库在不同的时间安排类似的任务。
对于我使用芹菜节拍的相同,下面的代码片段会给出一个想法
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中只有一个打印(可能是随机的,肯定不是按顺序)
请帮忙, 非常感谢提前:)
答案 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"]))