Django长请求超时

时间:2017-08-02 11:33:24

标签: python django

我在Django应用程序中有一个视图,它将一个大型csv文件作为输入,它循环所有行并在DB上插入数据。 本地我没有问题但是当我在线部署我的proj时,视图会在一段时间后给我一个超时。 我的网络服务器配置是Nginx + Gunicorn。 我尝试通过写一个大数字(120000)来增加Gunicorn和proxy_connect_timeout上的超时,在Nginx上的proxy_read_timeout,现在更好,我在大约90秒而不是30(Gunicorn的默认值)后超时,但仍然不是我的预期,并且它还不足以完成我的工作。 此外,我不喜欢这种方法,我不希望每个请求都有无限超时。 什么是处理长请求而没有超时的最佳方法? 也许通过回复用户的消息,然后在后台运行作业?有什么建议吗? 感谢。

2 个答案:

答案 0 :(得分:4)

将Celery与Django一起用于后台任务处理,这意味着使用芹菜异步任务处理CSV文件。

OR

快速破解,如果你不想使用芹菜;使用多线程处理CSV并将处理结果保存在DB或文件中,并将结果保存在DB或文件中。

注意:永远不要在主线程上处理大文件;总是尝试使用不同的服务器来处理大文件。如果不能使用不同的服务器,那么尝试在后台任务中处理它

Many solutions can be found on this StackOverflow link

答案 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