2012-10-25 29 views
2

我在Windows上使用Waitress作爲應用程序服務器和IIS作爲Web服務器(代理)運行Pyramid應用程序。當我運行這個應用程序時,它會在一個(看似)隨機的時間內工作,然後停止。它可能會持續幾天,甚至幾個星期,然後停下來,讓IIS拋出502錯誤。當它停止時,在重新啓動Windows之後無法重新啓動它。使用APScheduler後面的IIS後面的金字塔(服務員)隨機停止工作

這是一個小型應用程序,它使用APScheduler命中幾個API來同步eBay/Amazon之間的庫存。我不完全確定是什麼導致了這個問題,因爲日誌中沒有顯示錯誤。我有一個老版本的應用程序運行(沒有APScheduler),我沒有這個問題,所以我假設它與APScheduler有關。

有沒有人經歷過這個?

回答

3

首先讓我說我自己還沒有使用APScheduler,並且幾乎沒有關於在Windows和IIS上運行Python服務器(或其他任何東西)的知識。
所以我只能在這裏猜測,但似乎很清楚你的問題是以某種方式與APScheduler相關的。由於GIL(Python中的全局解釋器鎖),我可以想象在APScheduler用於後臺任務的線程中出現了問題,並且掛起的線程導致整個應用程序停止運行。例如,當你的線程遇到某種競爭條件時,可能會發生這種情況。 也許恰好在上一次迭代完成處理之前開始處理。或者你會得到一個非常大的積壓,這會導致處理開始時出現問題。

無論如何,我認爲任務隊列更適合於Web應用程序中的後臺處理,因爲它們單獨運行並且脫離了Web服務器的上下文。 您可以在任務被某些用戶操作觸發時立即安排任務,並且只要有工作人員可用,就會立即處理任務,並且不會延遲到某個特定時間點。
我會推薦給Celery一個嘗試,但也有其他解決方案可用,許多基於Redis。

Celery功能非常強大,並具有高級功能,如週期性任務和crontab樣式表 - 因此您可以使用它來做現在使用APScheduler所做的工作。

這看起來非常有幫助的Windows下設置芹菜:http://mrtn.me/blog/2012/07/04/django-on-windows-run-celery-as-a-windows-service/
這也可以證明是有益的: How to create Celery Windows Service?
注:我還沒有嘗試過任何這些我自己,因爲我使用Linux,如果我有一個選擇。

也許可以使APScheduler正常工作,但我認爲使用Celery會容易得多,因爲如果在工作中發生問題,您將能夠比在發生問題時更容易進行調試後臺線程。芹菜也可以配置爲在發生錯誤時自動發送電子郵件。