我写了一python脚本过程中的某些数据从CSV文件。脚本需要之间3到30分钟的时间来完成,根据大小的CSV。

现在我想放在一个网络界面,这样我可以上传CSV数据文件,从任何地方。我写了一个基本HTTP POST upload页和使用Python CGI模块,但该脚本只是次后一些时间。

脚本输出HTTP头开始,并且输出数据后的迭代,每线的CSV。作为一个例子,这个打印的发言将触发器每30秒左右。

# at the very top, with the 'import's
print "Content-type: text/html\n\n Processing ... <br />"

# the really long loop.
for currentRecord in csvRecords:
    count = count + 1
    print "On line " + str(count) + " <br />"

我假定的浏览器将会收到标题,并等待,因为它不断接收点位的数据。但是,实际上似乎出现的情况是,它没有收到任何数据, Error 504 时间出来的时候给予CSV有很多线。

也许有一些缓存发生的事情的地方?从该日志,

[Wed Jan 20 16:59:09 2010] [error] [client ::1] Script timed out before returning headers: datacruncher.py, referer: http://localhost/index.htm
[Wed Jan 20 17:04:09 2010] [warn] [client ::1] Timeout waiting for output from CGI script /Library/WebServer/CGI-Executables/datacruncher.py, referer: http://localhost/index.htm

什么是最好的方式来解决这个问题,或者,它是不适当的运行这样的脚本中浏览器?

编辑: 这是一个脚本用的是我自己使用的-我通常打算用它在我的电脑,但我认为一个基于网络的界面,可以派上用场,而旅行,或者例如从一个电话。此外,真的没有什么上下载-脚本很可能将电子邮件报告在结束。

有帮助吗?

解决方案

我会单独工作就像这样:

  1. 一个网络应用程序的网址,接受贴CSV文件。该网络应用程序使CSV内容为一线的队列,例如一个数据库表。该网络应用程序的反应应该是一个独特的ID排队的项目(使用自动增加ID列,例如)。客户必须储存这ID第3部分。

  2. 一个独立的业务应用程序,调查队的工作,并且处理。在完成处理、储存结果在另一个数据库表,使用唯一标识作为一个关键。

  3. 一个网络应用程序的网址可以得到的处理结果, http://server/getresults/uniqueid/.如果处理是成品(即的唯一标识被发现在该结果的数据表),然后返回的结果。如果没有结束,应该被一个代码表示这一点。例如一个自定义HTTP头,HTTP状态的反应,响应体'待定'或类似的。

其他提示

我有这个情况之前,我使用cronjobs。要执行的HTTP脚本将只是在队列写一个作业(DB或者在目录中的文件),并且将的cronjob读它并执行该作业。

您可能会需要做一个stdout.flush(),因为脚本是不是真的写任何东西到Web服务器,直到你写数据的页面缓存的价值 - 不超时发生之前

但是,为了解决这个,作为其他建议,要做的处理在独立的线程/进程,并且向用户示出一个自动刷新页面,其示出的状态,以进度条或其他一些花式视觉有道从无聊保留它们。

请参阅兰德尔Schwartz的通过CGI 看长过程。的制品使用Perl,但该技术不依赖于语言。

非常类似的问题这里。我建议产卵掉漫长的过程,并返回一个基于AJAX的进度条给用户。这样,他们的用户具有网络接口的奢侈品,你有没有超时的奢侈品。

恕我直言,最好的办法是独立运行脚本的帖子更新的地方(平面文件,数据库等)。我不知道如何从蟒叉一个独立的程序,所以我不能给任何代码示例。

要显示在网站上实现进展Ajax请求一个网页,读取那些状态更新,并且例如示出了很好的进度条。

...添加类似的setTimeout(“refreshProgressBar [...])或元刷新为自动刷新。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top