我正在服务器端用django编写一个Web应用程序。服务器需要大约4秒钟才能生成对用户的响应。它利用了天气api。我的应用程序必须对每个用户请求的api进行~50查询。
服务器端使用python的urllib来使用weather api。我使用pythons线程来加速进程,因为urllib是同步的。我正在使用带有apache的wsgi。问题是wsgi stack是完全同步的,当许多用户使用我的应用程序时,他们必须等待一个anothers请求完成。由于每个请求需要约4秒,这是不可接受的。
我有点卡住了,我该怎么办? 感谢
答案 0 :(得分:0)
每个请求对外部资源进行50次查询可能是一个不好的地方,而且可能根本不需要。
天气并没有那么快地改变,所以你可以通过缓存一段时间的结果来获益。然后,您获得的请求数量无关紧要,您每天不需要进行多次查询
如果那不是您的情况,您可以让客户为您完成工作。重构代码,以便在javascript中在客户端上发生天气api聚合,而不是通过服务器汇总它。
编辑:根据您发布的评论,您要求的内容可能无法在您使用的API的限制范围内进行优化。问题在于,该服务正在很好地抽象出他们聚合到最近位置查询的许多天气信息来源的差异。毕竟,气象站只提供点数据。
如果您直接与提供API的技术支持人员交谈,您可能会发现他们愿意支持更复杂的查询(边界框),他们会为此向您提供说明。但更可能的是,他们将其抽象出来,因为他们不想真正揭示他们的API实际提供的解决方案,或者因为他们对数据进行建模或执行计算以进行此类查询的方式存在一些技术原因太难支持了。
没有它或缓存,你只是运气不好。
答案 1 :(得分:0)
如果您在多线程配置或甚至多进程配置中使用mod_wsgi,则一个请求不应阻止另一个请求执行某些操作。他们应该能够同时运行。如果使用多线程配置,您确定您没有在自己的应用程序中的某些资源上使用某种锁定机制,这会阻止通过相同代码段运行的请求吗?另一种可能性是您已经很好地配置了Apache MPM和/或mod_wsgi守护程序模式,以便排除并发请求。
无论如何,正如另一个答案中所提到的,你最好先查看缓存策略,以便首先避免天气查找,或者卸载到客户端。