2016-09-26 68 views
0

我試圖發現在Django 1.8啓動時出現延遲的原因,特別是在調試器(在我的情況下爲WingIDE 5和6)中運行時,但不僅如此。Django 1.8啓動延遲故障排除

最小測試用例:Django 1.8教程「poll」示例,完成到「manage.py runserver」工作的第一個點。所有的默認配置,使用SQLite。 Python 3.5.2與Django 1.8.14,在一個新的venv。

在Linux(Mint 18)和Windows(7-64)的命令行中,這可能會以2秒的速度運行,以達到「正在啓動開發服務器」消息。但在Windows上,它有時需要10+秒。在兩臺機器上的調試器中,可能需要40秒。

一個特定問題:通過在django/__init__.py setup()的開始和結尾處放置打印語句,我注意到在「正在啓動...」消息之前以及在該消息之後再次調用此函數兩次;前兩次分別貢獻了一半的延遲。這表明django已經開始三次了。那個目的是什麼,還是它表明一個問題?我發現我可以使用runserver --noreload選項去掉前兩個啓動()中的一個,但是爲什麼它首先發生?還有一個startup()調用「Starting ...」消息)。

總結問題: - 對延遲負責的任何見解? - 爲什麼Django需要啓動三次? (或兩次,即使--noreload)。

+1

有同樣的問題,降級你的python3.5.2到python3.4.4,它會工作得很好。然後重建你的環境。 – sebb

+0

@sebb很高興不會感到孤單:-)。你有什麼想法從3.4.4改變到3.5.2導致這種情況?我相信你做出這樣的改變會讓你的問題消失。但是,這樣的改變太容易修復Python版本本身的外設。 – gwideman

+0

據我所知,python3.5,django和mint存在問題。不幸的是,我不知道是什麼問題。同事也有同樣的問題,告訴他降級蟒蛇和所有工人罰款。 – sebb

回答

0

部分答案。

經過一段時間WingIDE IDE的調試器和一些使用cProfile分析後,我找到了主要的CPU佔用問題。

在最初的django啓動過程中,有一連串的導入,其中validators.py模塊準備了一些編譯的正則表達式供以後使用。尤其是一個URLValidator.regex,它很複雜,還涉及到五個Unicode字符集(變量ul)的實例。這會導致re.compile執行大量的處理,特別是在sre_compile.py _optimize_charset()和大量的fixup()函數調用中。

碰巧,調用和數據結構的特定組合顯然在WingIDE 6.0b2調試器中遇到了一個特殊的緩慢。它在WingIDE 5.1調試器中速度相當快(儘管仍然比從命令行運行時慢)。不知道爲什麼,但Wingware正在研究它。

這並不能解釋從Windows上的命令行啓動時偶爾出現的緩慢;有一個外面的變化,這是等待睡覺的驅動器喚醒。仍在觀察。