Python 有个东西叫做 C-API,
https://docs.python.org/3/c-api/index.html,让开发者可以用 C 代码来访问 Python 解释器内部,这样就可以用 C 来获取 Python 中的对象,执行 Python 中定义的函数函数等。
1. uwsgi 中并没有集成一个 Python 虚拟机,它只是调用了 Python 提供的 C 接口,启动后在内存中创建了 Python 虚拟机实例。
# 初始化 Python 实例的位置
https://github.com/unbit/uwsgi/blob/11ca00432176f4246881870ea6c7c4ea5a26481f/plugins/python/python_plugin.c#L302分析 uwsgi 依赖的动态库,可以看到它是依赖 Python 的。
ø> otool -L `which uwsgi` 22:29:40 (05-11)
/usr/local/bin/uwsgi:
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1238.50.2)
/usr/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.8)
/usr/local/opt/pcre/lib/libpcre.1.dylib (compatibility version 4.0.0, current version 4.8.0)
/usr/lib/libxml2.2.dylib (compatibility version 10.0.0, current version 10.9.0)
/usr/lib/libicucore.A.dylib (compatibility version 1.0.0, current version 57.1.0)
/System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 1349.8.0)
/usr/local/opt/python3/Frameworks/Python.framework/Versions/3.6/Python (compatibility version 3.6.0, current version 3.6.0)
2. uwsgi 启动后会将 wsgi App 对象(例如 flask 的 app 对象)加载到内存中。然后每次请求到来后,调用 wsgi App 对象来处理请求。
# 加载 wsgi app 对象的位置
https://github.com/unbit/uwsgi/blob/58c920bf96b86450f88d02a1df9043e754550483/plugins/python/pyloader.c#L194