Windows上的哪种Python工作阻止了mod-wsg/Apache处理多个请求的能力?



我正在使用带有python 2.7的Windows上的Apache + mod-wsgi + django设置。似乎在 Windows 上为 mod-wsgi 进行的唯一可能的设置是具有 1 个具有许多子工作线程的进程。正因为如此,似乎有些工作可能会受到 GIL 的约束。我注意到数据库请求似乎不会导致锁定,但某些 python 处理确实会导致锁定/减速。

例如:

如果我通过 soaplib 使用 lxml 处理大型 xml 文件,它会导致速度大幅下降。阅读文档,似乎解决方案是使用 WSGIApplicationGroup %{GLOBAL} .旁注,这甚至可以在Windows中使用吗?

如果我通过 python 本机执行大型列表处理工作,这是 CPU 密集型的,它似乎也会减慢其他请求的速度。

我想知道是否有一类通用的工作会导致 django/python 锁定直到完成。如果是这样,有哪些最佳实践可以避免这些问题?

设置WSGIApplicationGroup %{GLOBAL}虽然在使用 lxml 时是可取的,但并不能解决性能问题。它可以防止由于 lxml 与子解释器不兼容而导致的死锁和崩溃。因此完全不同的问题。

至于性能,如果您有许多请求执行仅 CPU 密集型 Python 代码,那么就会有一些 GIL 争用,但这只会降低整体吞吐量,而不会阻止也在执行 CPU 密集型工作的并发请求。这是因为 Python 解释器将导致线程的控制隐式生成每隔一定数量的 Python 字节代码指令,以便其他线程可以运行。

更大的问题是你正在使用一个具有 C 扩展组件的模块,它正在执行 CPU 密集型长时间运行的任务,它正在做什么意味着它必须在 Python 数据结构上运行,因此无法释放 GIL 以允许其他线程运行。换句话说,需要很长时间并且不释放 GIL 的 C 代码会锁定其他线程。

如果您看到此类问题,因为Windows不允许多进程Apache,则必须使用某种后端任务队列系统,该系统可以将实际工作以某种方式分开进程。在UNIX系统上,你可以使用Celery或Redis Queue。我不知道你在Windows上的选择是什么。

至于为什么在进行一些CPU或内存密集型计算时会出现"大规模减速",这不一定与GIL有关,可能只是您的系统无法应对负载。扩展繁重的处理通常使用多服务器设置(最终使用并行化)来处理。

最新更新