任何 Web 服务器都可能必须同时处理大量请求。由于python解释器实际上有GIL约束,那么并发是如何实现的呢?
他们是否使用多个进程并使用 IPC 进行状态共享?
任何 Web 服务器都可能必须同时处理大量请求。由于python解释器实际上有GIL约束,那么并发是如何实现的呢?
他们是否使用多个进程并使用 IPC 进行状态共享?
您通常有许多工人(即 gunicorn),每个工人都有独立的请求。其他一切(与并发相关的)都由数据库处理,因此它是从您那里抽象出来的。
你不需要 IPC,你只需要一个“单一数据源”,它将是 RDBMS、一个缓存服务器(redis、memcached)等。
首先,请求可以独立处理。但是,服务器希望同时处理它们,以便将每次可以处理的请求数保持在最大值。
这个并发概念的实现依赖于网络服务器。
一些实现可能有固定数量的线程或进程来处理请求。如果所有请求都在使用中,则必须等待处理其他请求。
另一种可能性是为每个请求生成一个进程或线程。为每个请求生成一个进程会导致荒谬的内存和 CPU 开销。产生轻量级线程更好。这样做,您可以每秒为数百个客户提供服务。然而,线程也带来了管理开销,表现在高内存和 CPU 消耗上。
对于每秒服务数千个客户端,基于异步协程的事件驱动架构是最先进的解决方案。它使服务器能够以高速率为客户端提供服务,而无需产生数以亿计的线程。在所谓的 C10k 问题的 Wikipedia 页面上,您可以找到 Web 服务器的列表。其中,许多人使用这种架构。
协程也可用于 Python。看看http://www.gevent.org/。这就是为什么基于例如uWSGI + gevent 的 Python WSGI 应用程序是一个非常高效的解决方案。
像平常一样。Web 服务主要受 I/O 限制,并且 GIL 在 I/O 操作期间释放。因此,要么在没有任何特殊调整的情况下使用线程,要么使用事件循环(例如 Twisted)。