質問

CSV ファイルのデータを処理するための Python スクリプトを作成しました。CSV のサイズに応じて、スクリプトが完了するまでに 3 ~ 30 分かかります。

ここで、これに 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 />"

ブラウザは少量のデータを受信し続けるため、ヘッダーを受信して​​待機するだろうと想定していました。しかし、実際に起こっているのは、データをまったく受信していないことです。 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

これを解決する最善の方法は何ですか? それとも、そのようなスクリプトをブラウザで実行するのは適切ではありませんか?

編集:これは私自身が使用するためのスクリプトです。通常は自分のコンピュータで使用するつもりですが、旅行中や電話などから Web ベースのインターフェイスが便利だと思いました。また、実際にはダウンロードするものは何もありません。スクリプトはおそらく最後にレポートを電子メールで送信します。

役に立ちましたか?

解決

私なら次のように作業を分けます。

  1. POST された CSV ファイルを受け入れる Web アプリの URL。Web アプリは、CSV コンテンツをオフライン キュー (データベース テーブルなど) に配置します。Web アプリの応答は、キューに登録されたアイテムの一意の ID である必要があります (たとえば、自動インクリメントされる ID 列を使用します)。クライアントはパート 3 用にこの ID を保存する必要があります。

  2. 作業のためにキューをポーリングし、処理を実行するスタンドアロン サービス アプリ。処理が完了したら、一意の ID をキーとして使用して、結果を別のデータベース テーブルに保存します。

  3. 処理結果を取得できるWebアプリのURL、 http://server/getresults/uniqueid/. 。処理が完了した場合(つまり、一意の ID は結果データベース テーブルで見つかります)、結果を返します。完了していない場合、応答はそれを示すコードである必要があります。たとえば、カスタム HTTP ヘッダー、HTTP ステータス応答、応答本文「PENDING」などです。

他のヒント

私は前にこのような状況を持っていたと私はcronジョブを使用していました。 HTTPスクリプトはちょうど(DBまたはディレクトリ内のファイル)キューで実行するジョブを記述しますし、cronジョブはそれを読み、そのジョブを実行します。

スクリプトが本当に何を書いて、まだWebサーバにされていないとして、

あなたはおそらく、あなたがデータのページバッファの価値が書いたまで、stdout.flush()を行う必要があります - 。タイムアウトの前に発生しません。

しかし、プログレスバーや視覚的ないくつかの他の空想で、別のスレッド/プロセスで処理を行うと、ユーザーにステータスが表示され、オートリフレッシュページを表示するために、他の人が示唆したように、これは、ある解決するための適切な方法退屈さからそれらを維持する。

を参照してくださいランダルシュワルツのはCGI を経由長いプロセスを見て。記事は、Perlを使用しますが、この技術は、言語に依存しません。

非常に類似した質問ここを。私は長いプロセスをオフに産卵し、ユーザへのAJAXベースのプログレスバーを返すことをお勧めします。この方法で、それらのユーザーのWebインタフェースの贅沢を持って、あなたは時間がないアウトの贅沢を持っています。

私見最善の方法は、独立したスクリプトの記事の更新のどこか(フラットファイル、データベース、など...)を実行することです。私は私が任意のコード例を与えることができないので、のpythonから独立したプロセスをフォークする方法がわからない。

のウェブサイト上の進行状況を表示するためにこれらのステータスの更新を読み取り、例えば、ショー素敵なプログレスバーのページへのAJAXリクエストを実装します。

オートリフレッシュのためのsetTimeout( "refreshProgressBar [...])またはメタリフレッシュのようなものを追加します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top