好吧所以我想解释一下我的小django问题,我无法绕过它。
问题
我有一个小网站,只有几页显示数据库记录列表。该网站是我公司的内部渲染农场监视器,可能随时有十几个或两个活动连接。不超过50。
问题是我有三个更新服务,在打开时会导致真正的性能损失。
每个更新服务都是以下的python脚本:
他们发送的URL请求我的django网站轮询外部服务并将新数据读入我们的django数据库。网址看起来像这样:
当打开这些更新服务(尤其是updateTasks)时,http://webgrid/甚至可能需要超过10秒才能开始为普通用户加载。
设置
Django 1.8,与Gunicron v18一起部署。
主要的gunicorn服务使用这些参数运行(拆分成一个列表以便于阅读)。
<PATH_TO_PYTHON>
<PATH_TO_GUNICORN>
-b localhost:80001
-u farmer
-t 600
-g <COMPANY_NAME>
--max-requests 10000
-n bb_webgrid
-w 17
-p /var/run/gunicorn_bb_webgrid.pid
-D
--log-file /xfs/GridEngine/bbgrid_log/bb_webgrid.log
bb_webgrid.wsgi:application
此站点的Apache配置:
<VirtualHost *:80>
ServerName webgrid.<INTERAL_COMPANY_URL>
ServerAlias webgrid
SetEnv force-proxy-request-1.0 1
DocumentRoot /xfs/GridEngine/bb_webgrid/www
CustomLog logs/webgrid_access.log combined
ErrorLog logs/webgrid_error.log
#LogLevel warn
<Directory "/xfs/GridEngine/bb_webgrid/www">
AllowOverride All
</Directory>
WSGIDaemonProcess webgrid processes=17 threads=17
WSGIProcessGroup webgrid
</VirtualHost>
答案 0 :(得分:4)
这种事情不应该在网上完成;通过点击指向视图的URL,您不必要地占用您的网络服务器,这会阻止它完成其真正的工作,即响应用户请求。
相反,这是带外的。一个非常简单的方法就是写一个Django management command;这样您就可以从命令行脚本轻松调用模型方法。现在,您可以简单地指出您的cron作业或其他任何内容来调用这些命令,而不是调用一个单独的Python脚本来调用您站点上的URL。
另一种方法是使用芹菜;它是一个非常好的系统,用于执行长时间运行的异步任务。它甚至有自己的调度系统,所以你可以完全替换你的cron作业。