如何防止Apache在处理多个请求时冻结Django视图输出Matplotlib图像?
我有一个用Django搭建的网站,它会根据存储在MySQL数据库中的数字生成matplotlib图像。
其中一个页面会显示最多5张图片。这些图片的来源不是静态文件,而是指向Django的视图,这些视图会生成PNG格式的图片。加载这些图片可能需要最长5秒钟。每张图片对应不同的绘图方法,每种方法在Django视图中都有自己的函数。
当同时请求多张图片时,服务器就会卡住。我是在用xampp开发这个网站。此时我无法在另一个标签页中打开这个网站,或者访问同一服务器上运行的其他PHP网站。
如果我尝试在初始页面加载时一次性加载所有图片,服务器就会卡住。如果我先加载页面,然后用jquery/ajax单独请求图片(并耐心等待),就没有问题。如果我快速发起两个ajax请求,服务器又会卡住。
有没有人能解释一下问题可能出在哪里?
我能否强制服务器按顺序执行请求?
我能否用JavaScript延迟每个请求,直到前一张图片返回(而不仅仅是在链接更新时)?
或者我能否给请求设置一个时间限制,以防止服务器挂起?
谢谢。如果有人能帮我解决这个问题,那将是个大帮助。
2 个回答
你是不是在用Apache服务器来提供图片?如果是的话,可以考虑换一个更轻便的服务器来处理你的媒体文件,比如nginx、lighttpd、TUX、Cherokee,甚至是一个简化版的Apache。
如果你不想保存图片,可以把图片存放在一个临时目录里,然后在那个地方提供服务。
你可以在这里查看一些详细的文档:https://docs.djangoproject.com/en/dev/howto/static-files/
我觉得问题可能出在Apache一直在处理大量的媒体文件(这些文件比较大),导致你连接数用完了。这时候,换一个轻便的服务器就能帮上忙,因为它能处理更多的连接,而Apache可能做不到。
你可以用一个两步走的方式来生成这些页面:
- 在第一次请求时,把生成图片的任务放进一个排队系统,比如celery。然后用一个单独的进程来执行这些任务,并调整它,让它能同时处理尽可能多的任务。
- 在客户端,使用ajax来定期向服务器询问,看看图片生成的任务什么时候完成,然后再完成显示。