使用芹菜对Django中任务的非周期性重复



我需要以随机的时间间隔运行任务" createNotifications"。这是我在芹菜的设置中要做的。

t = random.randint(45, 85)
## print "time = ", t
## celery app configuration
app.conf.CELERYBEAT_SCHEDULE = {
    # Executes at every 't' interval, where t is random
    'create-notifications': {
        'task': 'apps.notifications.tasks.CreateNotifications',
        'schedule': timedelta(seconds=t),
    },
}

现在的问题是,这些用于芹菜的设置仅执行一次(当我运行命令python manage.py runserver时),因此变量't',因此timedelta中的"秒"值是随机的,有一个随机的值,但是只有一次。

最终使上述过程成为一个周期性的,固定时间为x秒,仅在启动服务器时随机选择x。

另外,我尝试运行一个任务,并在循环中随机延迟时使用了无尽的任务,因此芹菜AutoDect仅执行一个任务,而该任务永无止境。我的目的是通过随机延迟在段循环中解决的。像这样(注意 ->'while'在函数createNotification())

@app.task
def CreateNotifications():
while True:
    upper_limit = models.MyUser.objects.all().aggregate(Max('id'))
    lower_limit = models.MyUser.objects.all().aggregate(Min('id'))
    ## select a user to be notified randomly
    to_user = None
    to = 0
    while to_user is None:
        to = random.randint(lower_limit['id__min'], upper_limit['id__max'])
        try:
            to_user = models.MyUser.objects.get(id=to)
        except:
            pass
    ## select a user to be notified from randomly
    frm_user = None
    frm = to
    while frm_user is None:
        while frm == to:
            frm = random.randint(lower_limit['id__min'], upper_limit['id__max'])
        try:
            frm_user = models.MyUser.objects.get(id=frm)
        except:
            pass
    notif_type = ['comment on', 'liked', 'shared']
    notif_media = ['post', 'picture', 'video']
    models.Notification.objects.create(
        notified_user = to_user,
        notifier = frm_user,
        notification_type = random.choice(notif_type),
        notification_media = random.choice(notif_media))
    to_user.new_notification_count += 1
    to_user.save()

    t = random.randint(35, 55)
    print "delay = ", t
    time.sleep(t)

它完全按照我的意愿做事,但是现在有4个不同的工人执行相同的任务,但我只想要一个。

我尝试过更改位于我的Virtualenv/bin/Directory中的芹菜文件,如下所示 ->芹菜。减少过程数量

因为/etc/effaults中没有芹菜文件,但仍然没有成功

任何帮助将不胜感激。

您真的不应该在芹菜任务中放一个无尽的循环。如果您需要一个专门的过程,最好是用它自己而不是通过芹菜运行它。

您将来可以在任务运行时重新安排一项新任务。如下:

@app.task
def create_notifications():
     try:
          #
     finally:
          t = random.randint(45, 85)
          create_notifications.apply_async(countdown=t)

另一个选项是要执行定期时间表的调度程序任务,但在不久的将来会随机排列通知任务。例如,如果调度程序任务每45秒运行一次。

@app.task
def schedule_notifications():
     t = random.randint(0, 40)
     create_notifications.apply_async(countdown=t)

相关内容

  • 没有找到相关文章

最新更新