芹菜中的任务队列

时间:2018-03-09 13:10:11

标签: python django celery

我有一个处理数据的服务。它是用Python(Django)编写的,并使用Celery使其异步。

处理我们的数据使用信用。您还可以购买积分,这是由Stripe-webhook触发的。

涉及信用变更的每项操作都列为"工作"。我有2个Celery任务,都将作业添加到某个JobId数据库。

我使用" job"用于跟踪在哪个工作中处理哪些数据的概念。

models.py:

class JobId(models.Model):
    user = models.ForeignKey(User, blank=True, null=True, default=None)
    job_time = models.DateTimeField(auto_now_add=True)
    # current credit level
    credits = models.IntegerField(default=0, null=True, blank=True)
    # credit impact / delta of this job
    credit_delta = models.IntegerField(default=0, null=True, blank=True)

tasks.py:

task_1_buy_credits(user):
    # credit level of user is searched in jobs_database (the users last job)
    # adds one line in the JobId database with the users new credit balance


task_2_use_credits(user,data):
    # upfront unknown amount of data get processed
    # credit level of user is searched in jobs_database (the users last job)
    # decide to process job completely or stop if credit level is insufficient

我目前的问题是,当人们一次启动多个工作时,之前的工作尚未完成。由于我的最终贷方余额尚不清楚,我将其设置为零以防止新工作现在开始,同时可能还有余额用于完成工作。

当同时处理作业时,当信用等级增加时,会发生类似的情况。

基本上,我需要一种解决方案,它只允许以与创建任务相同的顺序运行任务,并在上一个完成之后运行。

OR

我需要进行实时"用户相关的信用等级检查"适用于尚未完成的正在运行的任务的函数。

我无法在我的Django环境中运行此同步,因为我的超时为30秒,因为这是一个托管在heroku上的Web应用程序。

1 个答案:

答案 0 :(得分:0)

这是一个难题,因为Celery任务的设计是为了独立于其他任何事情。他们只关心您提供的信息,而不关心正在处理的工作的顺序。使用groups and chords可以通过几种方式解决这个问题,但我不知道它们如何满足您的需求。

在前面,我会向CharField模型添加task_id JobId。启动任务时,可以将返回的任务ID存储在该JobId的数据库中。因此,对于给定的用户ID,您可以检查该用户的作业状态,并在仍有待处理的作业时返回最近的信用状态。