Django 1.8启动延迟故障排除

时间:2016-09-26 10:19:52

标签: python django

我试图发现Django 1.8启动延迟的原因,尤其是,但不仅仅是在调试器中运行时(在我的情况下是WingIDE 5和6)。

最小测试用例:Django 1.8教程“poll”示例,仅在'manage.py runserver'工作的第一点完成。所有默认配置,使用SQLite。使用Django 1.8.14的Python 3.5.2,在一个新鲜的venv。

从命令行,在Linux(Mint 18)和Windows(7-64)上,这可能会在2秒内运行,以到达“正在启动开发服务器”消息。但在Windows上,它有时需要10秒以上。在两台机器上的调试器中,它可能需要40秒。

一个特定问题:通过在django/__init__.py setup()的开头和结尾放置print语句,我注意到在“Starting ...”消息之前调用此函数两次,并且在该消息之后再次调用此函数;前两次贡献了一半的延迟。这表明django正在开始三次。这是什么目的,还是表明存在问题?

(我确实发现我可以使用runserver --noreload选项摆脱前两个startup()中的一个。但是为什么它首先发生?并且在之后仍然有一个startup()调用“开始......”消息。)

总结一下这个问题: - 对可能导致延误的原因有何见解? - 为什么django需要开始三次? (或者两次,甚至是--noreload)。

1 个答案:

答案 0 :(得分: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命令行启动时偶尔出现的缓慢情况;这是一个外在的变化,这是等待睡眠驱动唤醒。仍在观察。