簡體   English   中英

Django,RabbitMQ和Celery - 為什么Celery在開發中更新我的Django代碼后會運行舊版本的任務?

[英]Django, RabbitMQ, & Celery - why does Celery run old versions of my tasks after I update my Django code in development?

所以我有一個Django應用程序偶爾會向Celery發送任務以進行異步執行。 我發現,當我在開發中處理我的代碼時,Django開發服務器知道如何自動檢測代碼何時更改,然后重新啟動服務器以便我可以看到我的更改。 但是,我的應用程序的RabbitMQ / Celery部分沒有了解開發中的這些變化。 如果我更改稍后將在Celery任務中運行的代碼,Celery仍將繼續運行舊版本的代碼。 我能夠接受改變的唯一方法是:

  1. 停止芹菜工人
  2. 停止RabbitMQ
  3. 重置RabbitMQ
  4. 啟動RabbitMQ
  5. 將用戶添加到我的Django應用程序配置使用的RabbitMQ
  6. 為此用戶設置適當的權限
  7. 重啟芹菜工人

然而,這似乎是一種比我應該采取的更為激烈的方法。 我可以使用更輕量級的方法嗎?

我發現,當我在開發中處理我的代碼時,Django開發服務器知道如何自動檢測代碼何時更改,然后重新啟動服務器以便我可以看到我的更改。 但是,我的應用程序的RabbitMQ / Celery部分沒有了解開發中的這些變化。

你在這里描述的是完全正確和預期的。 請記住,Python將使用模塊緩存 ,因此您需要在使用新代碼之前重新啟動Python解釋器。

問題是“為什么Celery沒有拿到新版本”,但這就是大多數圖書館的工作方式。 但是,Django開發服務器是個例外。 它有特殊的代碼,可以幫助它根據需要自動重新加載Python代碼。 它基本上重新啟動Web服務器,而無需重新啟動Web服務器

請注意,當您在生產中運行Django時,您可能必須重新啟動/重新加載您的服務器(因為您不會在生產中使用開發服務器,並且大多數生產服務器不會嘗試解決實施問題的麻煩檢測文件更改和自動重新加載服務器的功能)。

最后,您不需要重新啟動RabbitMQ。 您只需重新啟動Celery工作程序即可使用新版本的Python代碼。 但是,如果新版本的代碼正在更改消息中的數據,則可能必須清除隊列。 例如,當Celery工作程序期望接收版本2時,它可能正在接收消息的版本1。

暫無
暫無

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

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