为需要30分钟执行的脚本创建Web界面

Pra*_*nab 7 python timeout http-headers http-status-code-504

我编写了一个python脚本来处理CSV文件中的一些数据.该脚本需要3到30分钟才能完成,具体取决于CSV的大小.

现在我想为此添加一个Web界面,这样我就可以从任何地方上传CSV数据文件.我写了一个基本的HTTP POST上传页面,并使用了Python的CGI模块 - 但是脚本在一段时间后才会超时.

该脚本在开始时输出HTTP标头,并在迭代CSV的每一行之后输出数据位.例如,此print语句将每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 />"
Run Code Online (Sandbox Code Playgroud)

我假设浏览器会收到标题,并等待,因为它继续接收少量数据.但实际上似乎发生的事情是它根本没有收到任何数据,并且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
Run Code Online (Sandbox Code Playgroud)

解决此问题的最佳方法是什么,或者,在浏览器中运行此类脚本是不合适的?

编辑: 这是我自己使用的脚本 - 我通常打算在我的计算机上使用它,但我认为基于网络的界面可以在旅行时派上用场,或者例如从手机上派上用场.此外,实际上没有什么可下载的 - 该脚本很可能最终通过电子邮件发送报告.

cod*_*ape 12

我会把这样的工作分开:

  1. 接受POSTed CSV文件的Web应用程序URL.Web应用程序将CSV内容放入离线队列,例如数据库表.Web应用程序的响应应该是排队项目的唯一ID(例如,使用自动递增的ID列).客户端必须将此ID存储在第3部分中.

  2. 一个独立的服务应用程序,用于轮询队列以进行工作,并进行处理.完成处理后,使用唯一ID作为键将结果存储在另一个数据库表中.

  3. 可以获得处理结果的Web应用程序URL http://server/getresults/uniqueid/.如果处理已完成(即在结果数据库表中找到唯一ID),则返回结果.如果没有完成,响应应该是指示这一点的代码.例如,自定义HTTP标头,HTTP状态响应,响应正文"PENDING"或类似标题.


sha*_*eel 5

我以前遇到过这种情况而且我使用过cronjobs.HTTP脚本只会在队列中写入要执行的作业(DB或目录中的文件),而cronjob会读取它并执行该作业.