2014-02-28 53 views
9

因此,我有一個Django應用程序偶爾會將任務發送給Celery進行異步執行。我發現,當我在開發中處理我的代碼時,Django開發服務器知道如何自動檢測代碼已更改,然後重新啓動服務器,以便我可以看到我的更改。然而,我的應用程序的RabbitMQ/Celery部分並沒有考慮到開發中的這些變化。如果我更改了稍後將在Celery任務中運行的代碼,那麼Celery仍將繼續運行舊版本的代碼。我可以把它挑上的變化,唯一的方法是:Django,RabbitMQ和Celery - 爲什麼Celery在開發中更新我的Django代碼後運行舊版本的任務?

  1. 停止芹菜工人
  2. 停止RabbitMQ的
  3. 復位的RabbitMQ
  4. 開始的RabbitMQ
  5. 將用戶添加到RabbitMQ的那我的Django應用程序配置爲使用
  6. 爲此用戶設置適當的權限
  7. 重新啓動芹菜工人

但是,這似乎是一個比我應該採取的更爲激烈的方法。有沒有更輕量級的方法可以使用?

回答

12

我發現,我對我的開發代碼的工作,Django的 開發服務器知道代碼 改怎麼自動檢測,然後重新啓動服務器,這樣我可以看到我的變化。然而, 我的應用程序的RabbitMQ /芹菜部分並沒有拿起這些 的發展變化。

你在這裏描述的是完全正確和預期的。請記住,Python將使用module cache,因此在使用新代碼之前,您需要重新啓動Python解釋器。

問題是「爲什麼芹菜沒有拿起新版本」,但這是大多數圖書館工作的方式。但是,Django開發服務器是個例外。它有特殊的代碼,可以根據需要自動重新加載Python代碼。 It basically restarts the web server without you needing to restart the web server

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

最後,您不應該重新啓動RabbitMQ。您只需重新啓動Celery worker即可使用新版本的Python代碼。但是,如果新版本的代碼正在更改消息中的數據,則可能必須清除隊列。例如,芹菜工作人員可能在預期收到版本2時收到第1條消息。

相關問題