簡體   English   中英

Django中的芹菜芹菜任務運行一次(!)

[英]Celery periodic_task in Django run once(!)

我正在使用celery和Django創建一個periodic_task,我希望每X秒運行一次。該任務應產生幾個子任務,但我需要確保每個主要任務僅產生一組子任務。

這就是我所擁有的..

@periodic_task(run_every=datetime.timedelta(seconds=2))
def initialize_new_jobs():
    for obj in Queue.objects.filter(status__in=['I', 'Q']):
        obj = Queue.objects.get(id=obj.id)
        if obj.status not in ['I', 'Q']:
            continue
        obj.status = 'A'
        obj.save()
        create_other_task.delay(obj.id)

這種方法有效,但感覺不對。 我必須在循環開始時刷新obj,以確保另一個正在運行的periodic_task沒有在同一Queue對象上發出create_other_task。

有沒有更好的方法來做這種工作? 基本上,我想盡可能多地執行create_other_task,但每個隊列對象的狀態為I或Q的次數僅為ONCE。

這是我的問題的簡化版本,因此請忽略以下事實:我可以在創建Queue對象時僅運行create_other_task,而不是運行定期任務:)

您可以使用交易:

@periodic_task(run_every=datetime.timedelta(seconds=2))
@transaction.commit_on_success
def initialize_new_jobs():
    for obj in Queue.objects.select_for_update().filter(status__in=['I', 'Q']):
        obj.status = 'A'
        obj.save()
        create_other_task.delay(obj.id)

select_for_update()在行上設置排它鎖,以便其他用戶在嘗試讀取值時被阻止。 提交事務或回滾事務后,將釋放該鎖。 參考

這樣,您可以確保obj狀態為IQ ,並且obj.save()可以正常工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM