2

しばらくすると期限切れになる定期的なタスクを設定しようとしています。Django 1.5.1、セロリ 3.0.19、および django-celery 3.0.17 (すべて pip から) を使用しています。これは、タスクを作成するための抜粋コードです。

from django.utils import timezone
from datetime import timedelta, datetime
from djcelery.models import PeriodicTask, IntervalSchedule

interval = IntervalSchedule.objects.get(pk=1)  # Added through fixture - 3sec interval
expiration = timezone.now() + timedelta(seconds=10)
task = PeriodicTask(name='fill_%d' % profile.id,
                    task='fill_album',
                    args=[instance.id],
                    interval=interval,
                    expires=expiration) task.save()

そして、私はセロリを実行しています./manage.py celeryd -B

タスクは問題なく作成されており、beat は 3 秒ごとにタスクを実行していますが、10 秒経過しても有効期限が切れません。最初は、djangoとセロリの間のタイムゾーンの問題だと思ったので、3時間実行しましたが(UTCとの差)、それでも期限切れになりませんでした。

テスト中に、実際に一度期限切れにすることができました(そして、ロガーは3秒ごとに期限切れを繰り返し続けました)が、それ以来再現できませんでした。

誰かが私が間違っていることに光を当てることができますか? ありがとう!

4

2 に答える 2

1

私は同じ問題を抱えており、セロリビートは期限切れを尊重していないと思います。タスクにブレークポイントを設定した場合は、current_task.request オブジェクトを見て、expires に値があるかどうかを確認します (または、タスク内から current_task.request を出力します)。

私にとっては、タスクを手動で実行すると current_task.request.expires に値がありますが、セロリ ビートがそれをスケジュールする場合は None です。

セロリ3.1.11を使用しています

バグを報告しました: https://github.com/celery/celery/issues/2283

于 2014-09-29T18:35:19.997 に答える
0

次のように使用できますlast_run_at

task = PeriodicTask(name='fill_%d' % profile.id,
                    task='fill_album',
                    args=[instance.id],
                    interval=interval,
                    expires=expiration,
                    last_run_at=expiration)
task.save()
于 2013-07-15T16:28:44.667 に答える