什么样的 Python 在 Windows 上工作会阻止 mod-wsg/Apache 处理多个请求的能力?

What sort of Python work on Windows stops mod-wsg/Apache's ability to deal with multiple requests?

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

例如:

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

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

我想知道是否有一般 class 的工作会导致 django/python 锁定直到完成。如果是这样,避免这些问题的最佳做法是什么?

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

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

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

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

如果您遇到此类问题,因为 Windows 不允许多进程 Apache,您将不得不使用某种后端任务排队系统,它可以将实际工作分包给单独的进程不知何故。在 UNIX 系统上,您可以使用 Celery 或 Redis Queue。我不知道你在 Windows 上有什么选择。