apache/mod_wsgi/windows 上的 Django 多线程

apache/mod_wsgi/windows 上的 Django 多线程

我对 apache 和 django 的组合还很陌生,坦率地说,我对如何处理多线程还很不了解。具体来说,我在 Windows 服务器上运行,所以我知道 MPM 只是基于线程的。

我有一个应用程序为网站页面提供服务,另一个应用程序执行 CPU 密集型后台进程,该进程不时发生,最多需要 30 秒左右。我担心我可能会遇到性能问题,并且有几个问题,我希望这些也能帮助其他人...

  1. Apache 如何在线程之间分配并发请求?如何在 CPU 之间分配并发请求?什么样的逻辑驱动了这一点?每个请求都会产生一个单独的线程吗?
  2. 我可以手动指定某个应用在单独的 CPU 上运行吗?例如,如果我有一台有 4 个 CPU 的机器,我是否可以设置 1 个 CPU 用于网站请求,另外 3 个 CPU 用于按需运行后台进程?
  3. 多个线程如何读取/写入同一个数据库?我不希望发生冲突,因为写入将按用户进行,但我不知道这实际上是如何处理的。
  4. 如果我有多台这样的机器,例如在 EC2 上运行并有多个实例,会发生什么情况?请求如何分发?

谢谢

答案1

一般阅读请参阅:

apache 如何在线程之间分配并发请求?

对于多线程配置,有一个预先创建的线程池。当新请求到达时,该请求将交给池中的可用线程之一进行处理。完成后,线程将返回池中。

apache 如何在 CPU 之间分配并发请求?

事实并非如此,线程在特定时间点的运行位置由操作系统决定。Apache 不会将线程绑定到特定处理器,因此执行可以四处移动。

每个请求都会产生一个单独的线程吗?

对于 Apache 处理的 Web 请求,答案是否定的。

我可以手动指定某个应用程序在单独的 CPU 上运行吗?

有多种方法可以设置处理器亲和性,将进程绑定到处理器,但具体如何操作取决于系统。据我所知,Apache 本身不提供任何配置机制来执行此操作。

多个线程如何读取/写入同一个数据库?

小心。通常数据库服务器进程会担心所有这些,所以您不必担心。在客户端中,您确实需要确保每个线程都使用自己的数据库连接,方法是为每个请求创建一个,或者您有一个数据库连接池,线程在需要时从池中获取连接并在完成后返回它。

请注意,这假定数据库的访问是通过服务器进程进行调解的。如果您使用的是基于文件系统的数据库,则数据库客户端库应确保多线程访问是安全的。

如果我有多台这样的机器,例如在 EC2 上运行并有多个实例,会发生什么情况?请求如何分发?

您需要某种前端负载均衡器来分配请求。这可能是一个合适的负载均衡器,或者您可以使用 nginx 前端作为代理。

相关内容