【发布时间】:2019-07-26 18:21:00
【问题描述】:
我正在使用 uWSGI 来部署我的 WSGI 应用程序。是为每个请求编译 Python 文件,还是预编译一次?我没有看到任何 .pyc 文件。
【问题讨论】:
我正在使用 uWSGI 来部署我的 WSGI 应用程序。是为每个请求编译 Python 文件,还是预编译一次?我没有看到任何 .pyc 文件。
【问题讨论】:
Python 缓存模块字节码 - 直接在 python2.x 的同一位置,在 python3 的 __pycache__ 子文件夹下 - 但脚本(不同之处在于用法 - 如果导入它是一个模块,如果你执行它是一个脚本)总是被重新编译(这就是为什么主脚本通常很短很简单)。
IOW,您的主 wsgi 脚本将为每个新的服务器进程重新编译一次。通常,一个 wsgi 应用程序作为一个长时间运行的进程,它将处理一个以上的请求,所以即使这样,初始编译开销也不是问题(短脚本 + 每个进程只编译一次)...
此外,一旦启动 Python 进程,导入的模块就会缓存在内存中,因此每个进程只会真正导入(加载)一次。
请注意,运行该进程的用户必须对您的应用目录具有写入权限才能创建 .pyc 文件...当然还有对 .pyc 文件的读取权限。
【讨论】:
python -m modulename CLI 选项的原因。
如果您使用CPython,那么默认情况下,它不会在每次收到请求时编译,除非您手动配置它来执行此操作。
通过第一个请求,uWSGI 将加载 python 脚本 bytecode 并将在我知道的 2 个不同场景中重新加载它:
service uwsgi restart 然而,仍然有一种方法可以通过解释器抑制它来继续在每个请求中重新加载 python 脚本,例如:python -B my_amazing_view.py
更多详情请看这里:
【讨论】: