0

私はいくつかのCelery定期タスクを作成しようとしていますが、そのうちのいくつかは実行時にrun_everyを変更する機能を備えている必要があります。Celeryのドキュメントには、run_every属性をプロパティに変換することでこれを実行できるはずだと書かれています(http://packages.python.org/celery/faq.html#can-i-change-the-interval-of-a-実行時の定期的なタスク)。

これが私がしていることです:

class ParseSomeStuffTask(PeriodicTask):

    def run(self, **kwargs):
        # Do stuff

    @property
    def run_every(self):
        if datetime.now().weekday() in [1, 2, 3]:
            return timedelta(minutes=15)
        else:
            return timedelta(seconds=40)

残念ながら、celerybeatをオンにすると、次のエラーが発生します。

[Thu Sep 09 15:44:40 2010:CRITICAL / 828]:celerybeatが例外を発生させました:'datetime.timedelta'オブジェクトに属性がありません'is_due'

その後、シャットダウンします。Celeryのドキュメントは、run_everyをプロパティにしたときに何を返すかについては実際には説明していません。また、Googleを検索することもできませんでした。Celeryの変更ログによると、バージョン1.0.0以降、実行時に定期タスクの間隔を変更できるようになっています。

開発者 環境:

  • Python 2.6.5
  • Django 1.2.1
  • セロリ2.0.2
4

1 に答える 1

3

Celery 2.0 は、さまざまなスケジュール動作をサポートしています。とがありcelery.task.schedules.scheduleますcelery.task.schedules.crontab

これらのいずれかを返すか、スケジュールの独自のサブクラスを作成する必要があります。

from celery.task.schedules import schedule

@property
def run_every(self):
    if datetime.now().weekday() in [1, 2, 3]:
        return schedule(timedelta(minutes=15))
    else:
        return schedule(timedelta(seconds=40))

アトリビュートはrun_everyインスタンス化時に自動的に変換されますが、後で変換されません。

于 2010-09-10T06:42:13.813 に答える