我在Django应用程序中有一个视图,它将一个大型csv文件作为输入,它循环所有行并在DB上插入数据。 本地我没有问题但是当我在线部署我的proj时,视图会在一段时间后给我一个超时。 我的网络服务器配置是Nginx + Gunicorn。 我尝试通过写一个大数字(120000)来增加Gunicorn和proxy_connect_timeout上的超时,在Nginx上的proxy_read_timeout,现在更好,我在大约90秒而不是30(Gunicorn的默认值)后超时,但仍然不是我的预期,并且它还不足以完成我的工作。 此外,我不喜欢这种方法,我不希望每个请求都有无限超时。 什么是处理长请求而没有超时的最佳方法? 也许通过回复用户的消息,然后在后台运行作业?有什么建议吗? 感谢。
答案 0 :(得分:4)
将Celery与Django一起用于后台任务处理,这意味着使用芹菜异步任务处理CSV文件。
OR
快速破解,如果你不想使用芹菜;使用多线程处理CSV并将处理结果保存在DB或文件中,并将结果保存在DB或文件中。
注意:永远不要在主线程上处理大文件;总是尝试使用不同的服务器来处理大文件。如果不能使用不同的服务器,那么尝试在后台任务中处理它
答案 1 :(得分:0)
I spend more time to increase the request timeout. And Finally I got the soluton
For **Django Rest API ( Nginx + supervisor + Gunicorn + AWS )**
1. Add timeout in the gunicorn(Supervisor config)
[program:gunicorn]
command = <env_path>/env/bin/gunicorn --pythonpath=<python_path> --name=<nginx_name> --bind unix:/tmp/myproject.sock --workers 3 --graceful-timeout=900 --timeout=900 <project_path>.wsgi:application
directory=<project_path>
autostart=true
autorestart=true
stopsignal=TERM
stdout_logfile=/var/log/gunicorn.stdout.log
stdout_logfile_maxbytes=1MB
stdout_logfile_backups=5
stderr_logfile=/var/log/gunicorn.stderr.log
stderr_logfile_maxbytes=1MB
stderr_logfile_backups=5
2. Add proxy on nginx file
proxy_connect_timeout 900;
proxy_send_timeout 900;
proxy_read_timeout 900;
send_timeout 900;
3. Changes in Load Balancer ( If you configure -> in EC2 instance)
[Load Balancer][1]
[1]: https://i.stack.imgur.com/uSUrK.png