2016-09-26 120 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上的命令行启动时偶尔出现的缓慢;有一个外面的变化,这是等待睡觉的驱动器唤醒。仍在观察。