![](/img/trans.png)
[英]How to ensure task execution order per user using Celery, RabbitMQ and Django?
[英]How to ensure Django model saves before Celery task execution?
我有一個 Django 1.11 + MySQL + Celery 4.1 項目,其中一個視圖創建一個新的用戶記錄,然后啟動一個 Celery 任務來執行與其相關的其他長時間運行的操作。
這種情況下的典型問題是確保在 Celery 任務執行之前將用戶創建提交到數據庫。 否則,會出現競爭條件,如果任務在事務提交之前執行,則該任務可能會嘗試訪問不會退出的記錄。
我學會了解決這個問題的方法是始終將記錄創建包裝在手動事務或原子塊中,然后在此之后觸發 Celery 任務。 例如
def create_user():
with transaction.atomic():
user = User.objects.create(username='blah')
mytask.apply_async(args=[user.id])
@task
def mytask(user_id):
user = User.objects.get(id=user_id)
do_stuff(user)
但是,我仍然偶爾會看到錯誤DoesNotExist: User matching query does not exist
我的Celery 工作日志DoesNotExist: User matching query does not exist
,這意味着我的任務有時會在用戶記錄提交之前執行。
這不是正確的策略還是我沒有正確實施它?
我相信post_save
信號更適合您要執行的操作: https : post_save
。 此信號將created
參數作為布爾值發送,從而可以輕松地僅對對象創建進行操作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.