Django在apache / mod_wsgi / windows上进行multithreading

对于apache和django的组合,我相当陌生,坦白地说,如何处理multithreading。 具体来说,我运行在Windows服务器上,所以我知道MPM只是基于线程的。

我有一个服务于网站页面的应用程序,另一个应用程序执行一个不断发生的cpu密集型后台进程,时间长达30秒左右。 我担心我可能会遇到性能问题,并有几个问题,我希望这些也可以帮助其他人…

  1. apache如何在线程之间分配并发请求? 和CPU之间? 什么样的逻辑驱动这个? 每个请求是否生成一个单独的线程?
  2. 我可以手动指定某个应用程序在独立的CPU上运行吗? 例如,如果我有一台带有4个CPU的机器,我可以为网站请求设置1个CPU,还可以根据需要设置3个CPU来运行后台进程?
  3. multithreading如何读/写同一个数据库? 我不希望有冲突,因为写作是按用户进行的,但是我不知道这是如何处理的。
  4. 如果我有多台这样的机器,例如在EC2上运行并且有多个实例,会发生什么? 如何分发请求?

谢谢

一般阅读请看:

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

对于multithreadingconfiguration,有一个预先创build的线程池。 当一个新的请求到达时,会被切换到池中的一个可用线程进行处理。 完成后,线程返回到池中。

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

它并不是,在任何特定时间点运行的线程都由操作系统决定。 线程没有被Apache绑定到特定的处理器,所以执行可以四处移动。

每个请求是否生成一个单独的线程?

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

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

有许多方法可以设置处理器关联性,以便将进程绑定到处理器,但是您如何执行这些操作是依赖于系统的。 就我所知,Apache本身并没有提供任何configuration机制来实现这一点。

multithreading如何读/写同一个数据库?

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

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

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

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