【问题标题】:long time running python script长时间运行python脚本
【发布时间】:2012-02-15 08:10:20
【问题描述】:

我有以下部分的应用:

client->nginx->uwsgi(python)

有些 python 脚本可能会运行很长时间(2-6 分钟)。执行脚本后,我应该给客户端内容,但连接中断并出现错误“网关超时 504”。我可以用什么来避免这个错误?

【问题讨论】:

  • 6 分钟的请求非常慢,您的客户不喜欢您的程序。首先尝试设置缓存系统并优化数据库(如果你有巨大的表,比如去规范化和切片)。
  • 能否将脚本执行分成几个部分?
  • 不行,我不能分割剧本。并且脚本不会对数据库进行查询,也不会发送很多内容。它只是图像处理的算法,但算法需要一些时间(2-6分钟)才能产生结果。我的客户理解并愿意等待。

标签: python nginx wsgi


【解决方案1】:

那么您的目标是减少脚本的运行时间,还是不让它们超时?无论您尝试什么,浏览器都会放弃 6 分钟的请求。

也许尝试在服务器上完成工作,然后使用 AJAX 请求轮询进度?

或者,如果可能,尝试优化脚本。例如,如果您正在执行一些非常慢的 SQL 操作,请尝试清理它。

否则,如果没有更多信息,很难给出更具体的答案。

【讨论】:

  • 我想避免超时。我无法进行有价值的优化,因为脚本会处理图像,而该算法无法更快地运行。
  • 也许我可以更改 nginx 的源代码以增加 nginx 和 uwsgi(或 nginx 和客户端)之间的连接时间?
  • AJAX 似乎是唯一合理的解决方案:让服务器在后台继续处理,同时立即向用户返回“状态:处理”页面,其中包含定期轮询 JavaScript 代码一旦结果可用就检索它。
【解决方案2】:

我曾经建立了一个系统,其中“主页”包含一个 Iframe,它将长时间运行的程序的输出显示为 text/plain。我认为 Iframe 内容的处理程序是一个 Python CGI 脚本,它发出所有标头,然后在 Apache 服务器下逐行输出程序。

我不知道这在您的配置下是否可行。

【讨论】:

    【解决方案3】:

    这在很大程度上取决于您的服务器设置(即,将数据推送回客户端的难易程度),但是在运行冗长的应用程序时是否有可能定期发送一些“空”内容(例如,假设您的输出是纯换行符) html) 以便浏览器认为这只是一个缓慢的连接而不是停滞的连接?

    【讨论】:

      猜你喜欢
      • 2018-07-02
      • 2017-05-01
      • 2019-02-12
      • 2016-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-13
      相关资源
      最近更新 更多