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

时间:2015-06-11 12:34:51

标签: django windows apache mod-wsgi

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

例如:

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

如果我通过python本地执行大型列表处理作业,这会占用大量CPU,那么它似乎也会减慢其他请求。

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

2 个答案:

答案 0 :(得分:2)

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

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

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

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

答案 1 :(得分:0)

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