我对 mod_wsgi 的多处理功能以及将在具有多处理能力的 WSGI 服务器上执行的 WSGI 应用程序的一般设计有点困惑。
考虑以下指令:
WSGIDaemonProcess example processes=5 threads=1
如果我理解正确,mod_wsgi 将产生 5 个 Python(例如 CPython)进程,并且这些进程中的任何一个都可以接收来自用户的请求。
文档说:
共享数据需要对所有应用程序实例可见,无论它们在哪个子进程中执行,并且一个应用程序对数据所做的更改立即可供另一个应用程序使用,包括在另一个子进程中执行的任何操作,外部数据存储,例如必须使用数据库或共享内存。普通 Python 模块中的全局变量不能用于此目的。
但在这种情况下,当人们想要确保应用程序在任何 WSGI 条件下(包括多处理条件)运行时,它会变得非常繁重。
例如,一个包含当前连接用户数量的简单变量——它应该是进程安全的从 memcached 读/写到 memcached 还是一个 DB 或(如果这种超出标准的库机制可用)共享记忆?
并且代码会像
counter = 0
@app.route('/login')
def login():
...
counter += 1
...
@app.route('/logout')
def logout():
...
counter -= 1
...
@app.route('/show_users_count')
def show_users_count():
return counter
在多处理环境中表现不可预测?
谢谢!