【问题标题】:Django long request timeoutDjango 长请求超时
【发布时间】:2018-01-09 14:44:32
【问题描述】:

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

【问题讨论】:

  • 这样的工作,你应该使用celery+rabbitMQ等任务队列。
  • 不要尝试增加超时。视图在调用时应该快速响应。如果您需要执行长时间运行的任务,您应该查看异步作业执行。 Celery 最适合这个,但你也可以使用 python 线程在不同的线程中运行你的工作。见docs.python.org/3.6/library/threading.html
  • 是的,你是对的,增加超时不是我问的解决方案。谢谢你的回答。

标签: python django


【解决方案1】:

使用 Celery 和 Django 进行后台任务处理,这意味着使用 celery 异步任务处理 CSV 文件。

如果您不想使用 celery,可以快速入门;使用多线程处理 CSV 并将处理结果保存在 DB 或文件中,并将结果从 DB 或文件服务器。

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

Many solutions can be found on this StackOverflow link

【讨论】:

  • 我想使用 Celery,但由于它只是管理员的后端选项,也许它并没有被太多使用,所以我更喜欢不将 Celery 和 RabbitMQ/Redis 添加到我的堆栈中,所以我正在搜索如果有更简单的解决方案......你答案的第二部分呢?没看懂,能不能解释一下?
  • 我用 Celery 和 Redis 解决了我的问题,谢谢。
【解决方案2】:
    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

【讨论】:

  • 您可以在此处找到负载均衡器截图以供参考i.stack.imgur.com/uSUrK.png
  • 这对我有帮助!谢谢!问题是我需要在我的 gunicorn 文件中添加“--graceful-timeout=900 --timeout=900”并向 nginx 提供代理设置。现在加载大量数据时它不会超时。
猜你喜欢
  • 2021-10-13
  • 2017-02-06
  • 2012-09-29
  • 1970-01-01
  • 2015-05-08
  • 2011-02-26
  • 2019-08-21
  • 2021-12-19
  • 2011-04-19
相关资源
最近更新 更多