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

时间:2017-11-25 18:29:44

标签: python celery

新闻存储在数据库MySQL中,发布时间为datetime

任何时候用户都可以使用延迟日期发布在表格中添加新内容。

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

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

如何使用Celery做到这一点?

我认为使用dateid发布创建队列的另一种方法是直接在此队列中添加用户表单中的数据。因此sholud是进程(Celery),它按日期观察队列以进一步执行任务。

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

很抱歉,如果问题很简单,我是Python Celery的新手。

1 个答案:

答案 0 :(得分:1)

您可以使用eta上的参数apply_async()执行任务(参阅http://docs.celeryproject.org/en/latest/userguide/calling.html#eta-and-countdown

eta参数必须采用日期时间格式,因此它将以精确的毫秒精度运行。

我建议您使用ORM,因此数据库中的日期时间数据类型将由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])

保存新文章并使用 ETA + 1分钟

调用 set_published
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)