上个月研究 APIStar 源码, 发现启动 python app.py run
用的是 werkzeug 的 run_simple 方法, 仔细读了一下, 感触颇深, 用这篇日志分享一下整个执行流程.
大致流程:
(ps. 最好和下边的图一起看.)
- APIStar 入口:
python app.py run
→run_wsgi()
→werkzeug.run_simple()
werkzeug.run_simple()
- apistar/commands/run.py:26: 因为默认启用了 reloader(自动重启 server), 这时会去 检查WERKZ_RUN_MAIN
这个环境变量:- 第一次为
''
:- Step 1: 设置该环境变量为
true
- Step 2: 在 while 循环中启动一个 子进程 , 并运行 入口命令(
python app.py run
)
- Step 1: 设置该环境变量为
- 第二次为
true
:- Step 1:
srv.serve_forever()
:
用一个 thread 启动一个 server 去处理 request - werkzeug/serving.py:702 - Step 2:
reloader.run()
:
用 while 循环每隔一秒去检查所有 iter_module_files 和 self.extra_files, 比较每个文件的修改时间, 如果有更新的话 →sys.exist(3)
→ 结束 子进程, 重新运行入口命令(python app.py run) (回到外边的 while loop 中.)
- Step 1:
- 第一次为
总结
哎, 努力写了一堆文字, 但感觉还是无法解释的很清楚, 可以看上图中 左下角有个 Summary, 是简化版的逻辑.. 会比较清晰一些.
下次还是用画图工具, 将解释和流程图融合在一起, 效果应该会好很多.
说画就画, 但感觉死循环还是画的不够直观呀: