django在你执行python manage.py runserver的时候,在修改代码后会自动重启,研究一下是怎么实现的。

django/utils/autoreload.py
main(),我只看python_reloader,RUN_MAIN通过搜索源代码,发现只有在这个文件有两处,一个是下边else执行时设置为true。也就是说开始可能没有设置值,先执行restart_with_reloader()。精彩到了。。设置新的environ,RUN_MAIN为True。用os.spawnve启动新的reloader()进程,现在RUN_MAIN为True!然后在restart_with_reloader这个父进程里一直在等待判断子进程是否返回exit code,如果不是3就退出循环结束了。
在的reload进程执行new_thread(),也就是启动一个server。下边执行reloader_thread()
----
reloader_thread()里边
先执行ensure_echo_on(),先判断termios是否导入成功,termios是一个py模块,是unix平台的控制通信端口的,不怎么懂。如果模块没导入成功,将不做任何操作。如果导入成功,从字面意思就是确保echo打开。这不懂,也不是重点。

下边判断RUN_RELOADER,开始为True,进入循环,判断code_changed(),如果只要有一个文件改变code_changed就返回true。然后接着sys.exit(3)。每隔一秒判断一次。
如果py文件改变,执行了sys.exit(3),然后子进程就会结束。父进程在restart_with_reloader判断exit_code等于三,然后进行下一个while ture的循环。重新创建RUN_MAIN=True的子进程,重新创建一个server,等待(汗)代码修改 然后再退出,,,一直循环下去。

再说说exit_code不等与3的时候,比如子进程在启动server后,reloader_thread等待(再汗)代码改变的时候,你按了ctrl c,然后捕获KeyboardInterrupt异常,代码里什么都不做,然后子线程就会结束,这时exit_code不等于3,直接return exit_code结束了父进程,程序结束了。

上一篇:
下一篇:

相关文章:

Categories: 博客记录

0 Responses so far.

Leave a Reply