关于python:Django长请求超时

Django long request timeout

我在Django应用程序中有一个视图,它将一个大的csv文件作为输入,循环所有行,并在db上插入数据。在本地我没有问题,但是当我在线部署我的项目时,视图会在一段时间后给我一个超时。我的Web服务器配置是nginx+gunicorn。我试着在gunicorn和proxy connect-timeout上增加超时,在nginx上通过写一个大的数字(120000)来增加proxy-read-timeout,现在更好了,我在大约90秒后得到超时,而不是30秒(gunicorn的默认值),但仍然不是我所期望的,这还不足以完成我的工作。另外,我不太喜欢这种方法,我不希望每个请求都有无限的超时。处理长请求而没有超时的最佳方法是什么?可能是通过用一条消息回答用户,然后在后台运行作业?有什么建议吗?谢谢。


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

作为一个快速的黑客,如果你不想使用芹菜;使用多线程来处理csv,并将处理结果保存在db或file中,并将结果从db或file服务器上。

注意:不要在主线程上处理大文件;总是尝试使用其他服务器来处理大文件。如果无法使用其他服务器,则尝试在后台任务中处理它。

在这个stackoverflow链接上可以找到许多解决方案


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
    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