如何使用MySQL的datetime在Celery中执行任务?
问题描述:
新闻存储在数据库MySQL中,发布时为datetime
。如何使用MySQL的datetime在Celery中执行任务?
任何时候用户都可以在表格中添加一个新的延迟日期发布。
如何使用Celery来监听数据库表并检查是否应该发布数据?
对于发布数据负责另一个过程(脚本Python)。所以Celery应该根据datetime
为MySQL表中的每一行调用这个脚本。
如何使用芹菜做到这一点?
另一种方式,我认为创建与date
和id
发布队列,然后直接添加来自该队列的用户形式的数据。因此,sholud是进程(Celery),它观察队列以便按日期进一步执行任务。
Celery提供定期任务和计划任务的文档,但没有解释和示例如何使用它。
对不起,如果问题是微不足道的,我是Python芹菜的新手。
答
您可以通过使用paramater eta
上apply_async()
执行任务(参见http://docs.celeryproject.org/en/latest/userguide/calling.html#eta-and-countdown)
ETA参数必须是日期时间格式,所以它会确切毫秒精度运行。
我推荐你使用ORM,所以从你的数据库中的datetime数据类型将ORM自动转换:d
让我们说我们有一个文章型号:
class Article(models.Model):
title = models.CharField(max_length=100)
published = models.BooleanField(default=False)
created_date = models.DateTimeField()
,然后我们任务模块:
@app.task(bind=True)
def set_published(*args, **kwargs):
article = Article.objects.get(id=args[1])
article.published = True
article.save()
print("article %d has been published" % args[1])
保存新的文章,并呼吁set_published与ETA +1分钟
article = Article(title='This is a new article', published=False, created_date=datetime.utcnow())
article.save()
delta = timedelta(minutes=1)
set_published.apply_async(args=(article.id,), eta=article.created_date + delta)
您可以安排一个日常任务发布,其发布日期是'今日()' – schwobaseggl
我不需要,我需要安排使用的数据存储在任务的所有出版物数据库MySQL,并立即执行。另外数据库可以通过新日期进行扩展。所以芹菜应该非常谨慎地意识到这一点。你用sugest来使用静态混合日期。它不适合我。 – Oleg
你可以挂接到'save'或者连接到'post_save'信号,并打电话给你通过'apply_async(ETA = instance.publish_date)发布任务'。当然,如果日期没有改变,任务本身需要重新检查。 – schwobaseggl