如何使用MySQL的datetime在Celery中执行任务?

问题描述:

新闻存储在数据库MySQL中,发布时为datetime如何使用MySQL的datetime在Celery中执行任务?

任何时候用户都可以在表格中添加一个新的延迟日期发布。

如何使用Celery来监听数据库表并检查是否应该发布数据?

对于发布数据负责另一个过程(脚本Python)。所以Celery应该根据datetime为MySQL表中的每一行调用这个脚本。

如何使用芹菜做到这一点?

另一种方式,我认为创建与dateid发布队列,然后直接添加来自该队列的用户形式的数据。因此,sholud是进程(Celery),它观察队列以便按日期进一步执行任务。

Celery提供定期任务和计划任务的文档,但没有解释和示例如何使用它。

对不起,如果问题是微不足道的,我是Python芹菜的新手。

+0

您可以安排一个日常任务发布,其发布日期是'今日()' – schwobaseggl

+1

我不需要,我需要安排使用的数据存储在任务的所有出版物数据库MySQL,并立即执行。另外数据库可以通过新日期进行扩展。所以芹菜应该非常谨慎地意识到这一点。你用sugest来使用静态混合日期。它不适合我。 – Oleg

+1

你可以挂接到'save'或者连接到'post_save'信号,并打电话给你通过'apply_async(ETA = instance.publish_date)发布任务'。当然,如果日期没有改变,任务本身需要重新检查。 – schwobaseggl

您可以通过使用paramater etaapply_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_publishedETA +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) 
+0

你能分享一个短代码的例子吗? – Oleg

+1

编辑!这可能是简单的解决方案,你可以在模型中使用的信号(如post_save)来调用set_published功能,所以它会被调用每次保存条 – HQM