【问题标题】:django-celery PeriodicTask and eta fielddjango-celery PeriodicTask 和 eta 字段
【发布时间】:2015-06-06 02:48:31
【问题描述】:

我有一个与 celery 结合的 django 项目,我的需要是能够在未来的某个时间动态地安排任务,无论是否重复。我需要能够删除/编辑已安排的任务

为了实现这一点,我开始使用 django-celery 和 DatabaseScheduler 将一些 PeriodicTasks(过期)存储到数据库中,因为它或多或少地被描述为 here

这样,如果我关闭我的应用程序并重新启动它,我的日程安排仍然存在

我的问题仍然存在,因为我无法使用 eta 并在将来的某个时间安排任务。是否有可能以某种方式使用eta 动态安排任务?

我的第二个问题是我是否可以安排一次性任务,例如安排它运行在 2015-05-15 15:50:00 (这就是我尝试使用 eta 的原因)

最后,我将安排数以千计的通知,celery beat 是否能够处理这么多的计划任务?其中一些是一次性的,而另一些是周期性的?还是我必须使用更高级的解决方案,例如APScheduler

谢谢

【问题讨论】:

  • 你不想使用倒计时吧?你能告诉使用更多关于你想要执行的任务吗?我想我对你打算做什么没有正确的想法
  • 嗨,Maximilian,感谢您的关注,我已经稍微编辑了我的问题以使其更清楚

标签: celery django-celery celerybeat


【解决方案1】:

我昨天也遇到了同样的问题。我丑陋的临时解决方案是:

# tasks.py    
from djcelery.models import PeriodicTask, IntervalSchedule
from datetime import timedelta, datetime
from django.utils.timezone import now

...

@app.task
def schedule_periodic_task(task='app.tasks.task', task_args=[], task_kwargs={},
                           interval=(1, 'minute'), expires=now()+timedelta(days=365*100)):
    PeriodicTask.objects.filter(name=task+str(task_args)+str(task_kwargs)).delete()
    task = PeriodicTask.objects.create(
        name=task+str(task_args)+str(task_kwargs), task=task,
        args=str(task_args),
        kwargs=str(task_kwargs),
        interval=IntervalSchedule.objects.get_or_create(
            every=interval[0],
            period=interval[1])[0],
        expires=expires,
    )
    task.save()

所以,如果你想用 eta 安排周期性任务,你应该

# anywhere.py    
schedule_periodic_task.apply_async(
    kwargs={'task': 'grabber.tasks.grab_events',
            'task_args': [instance.xbet_id], 'task_kwargs': {},
            'interval': (10, 'seconds'),
            'expires': instance.start + timedelta(hours=3)},
    eta=instance.start,
)

使用 eta 安排任务,它会创建周期性任务。丑:

  1. 处理 raw.task.name
  2. 奇怪的周期(n,'间隔')

如果你设计了一些漂亮的解决方案,请告诉我。

【讨论】:

    猜你喜欢
    • 2015-08-27
    • 2013-07-07
    • 2011-02-03
    • 1970-01-01
    • 2013-03-18
    • 1970-01-01
    • 1970-01-01
    • 2018-01-29
    • 1970-01-01
    相关资源
    最近更新 更多