如何扩展当前使用django的响应时间长的webapp

如何扩展当前使用django的响应时间长的webapp,django,multithreading,api,web-applications,mod-wsgi,Django,Multithreading,Api,Web Applications,Mod Wsgi,我正在用django在服务器端编写一个web应用程序。服务器需要约4秒钟才能生成对用户的响应。它使用天气api。我的应用程序必须为每个用户请求对该api进行50次查询 服务器端使用python的urllib来使用天气api。我使用pythons线程来加快进程,因为urllib是同步的。我正在将wsgi与apache一起使用。问题是wsgi堆栈是完全同步的,当许多用户使用我的应用程序时,他们必须等待另一个用户的请求完成。由于每个请求需要约4秒钟,因此这是不可接受的 我有点困了,我能做什么? 谢谢每

我正在用django在服务器端编写一个web应用程序。服务器需要约4秒钟才能生成对用户的响应。它使用天气api。我的应用程序必须为每个用户请求对该api进行50次查询

服务器端使用python的urllib来使用天气api。我使用pythons线程来加快进程,因为urllib是同步的。我正在将wsgi与apache一起使用。问题是wsgi堆栈是完全同步的,当许多用户使用我的应用程序时,他们必须等待另一个用户的请求完成。由于每个请求需要约4秒钟,因此这是不可接受的

我有点困了,我能做什么?
谢谢

每个请求向外部资源进行50次查询可能不是一个好地方,也可能根本不必要

天气变化不会那么快,因此您可能只需将结果缓存一段时间就可以获得巨大的好处。然后不管你收到多少请求,你每天只需要做几个查询

如果这不是你的情况,你也许可以让客户为你做这项工作。重构代码,使weather api聚合以javascript在客户端上进行,而不是通过服务器进行

编辑:根据您发布的评论,您所要求的可能无法在您使用的API的约束范围内进行优化。问题在于,该服务在将多个天气信息源中的差异抽象为最近位置查询方面做得很好。毕竟,气象站只提供点数据

如果您直接与提供API的技术支持人员交谈,您可能会发现他们愿意支持更复杂的查询边界框,他们会为您提供说明。不过,更可能的情况是,他们将其抽象出来,因为他们不想实际揭示API实际提供的分辨率,或者因为他们建模数据或执行计算的方式存在一些技术原因,这会使此类查询难以支持


如果没有这一点或缓存,您就没有运气了。

如果您在多线程配置中使用mod_wsgi,甚至在多进程配置中,一个请求不应该阻止另一个请求执行某些操作。它们应该能够同时运行。如果使用多线程配置,您确定您没有在自己的应用程序中的某些资源上使用某种锁定机制,从而阻止通过同一代码段运行的请求吗?另一种可能性是,您对Apache MPM和/或mod_wsgi守护程序模式的配置不当,从而排除了并发请求


无论如何,正如在另一个答案中提到的,您最好先考虑缓存策略,以避免天气查询,或者将数据转移到客户端。

50个查询针对50个不同的位置完成。用户在地图上选择一个位置,应用程序必须查看该位置周围50个点的天气。这对评估是必要的。用户选择的位置可以是地球上的任何一点,所以我不确定缓存是否有帮助。我也想过使用javascript,但api使用策略阻止将我的api密钥公开,因此这看起来不像是一个选项。api支持边界框查询吗?不幸的是,不支持。这就是我使用的-此api似乎是我能找到的唯一一个可以用lat/lon查询的api。你能预切数据吗,而不是在请求时执行此操作?地球上任何点的数据都可能需要根据用户进行查询。我必须把全世界的天气数据都缓存起来,这太多了。另外,它每小时都在变化。我按照这里的说明配置了wsgi:我使用线程获取url,所以我认为我没有锁定任何东西。我没有对我的apache配置做任何特殊的处理,所以可能它会像你说的那样解决问题。我来看看。天气查询在服务器端是必要的,我在这个答案下对此进行了评论。你的评论“我正在使用线程获取url”没有意义。您不需要创建不同的线程来获取数据,除非您实际上同时启动多个后台线程来尝试并行化请求,然后等待它们全部完成。这就是您正在做的吗?顺便说一句,您应该真正了解mod_wsgi的守护程序模式。如果您只按照这些说明操作,您将在嵌入式模式下运行,除非您正确配置Apache MPM,否则可能会导致读取问题。至于我所遵循的说明,我想你是这么写的:它还显示了使用守护程序模式。我使用的是守护程序版本。顺便说一句,这篇博客文章确实帮助我理解了一些事情。正如你所说,我认为锁定机制是我的问题。伊夫 ixed它和wsgi现在可以在守护进程模式下工作了。谢谢