BLOGサブスレッドの日常

2016.05.16

KEN_ALL.LZH

tama

月曜日の #ハタチ です。おはたまー。

知ってますか KEN_ALL.LZH。
覚えてますか KEN_ALL.LZH。

一昔前みんなお世話になったよね。伝説のLZHファイル。
これだけのためにサーバに lha 入れたりしたわー。
今はZIPになってるんですよね

でっかいマスターを更新するときの進捗表示

大きめのCSVファイルをWeb管理画面からマスター登録するようなとき。
処理待ちしてるうちにタイムアウトしちゃったりしますよね。
(そもそもそんな処理をWebでやるなって思う方は恵まれた環境にいるかまたは原理主義的か…
実務的にはわりとふつーに要件にあったりするよね。よね)

マルチスレッドだのプロセス間通信だのそれ用のモジュールだの。
いろんな方法はありましょうが、言語を問わず汎用的に使える方法をひとつメモっておきます。

  1. 時間のかかる更新処理を単独のスクリプトに書く
    • update.py みたいな。実行権限を付けて、引数に処理するファイル名を取る
  2. 進捗をときどき特定のファイルに出力するようにする
    • 例えば100件ごとに progress.txt に処理件数を出力する、みたいな
    • 処理が終わったら "complete" とでも出力しましょう
  3. 実行開始は update.py filename &
    • OS任せでバックグラウンドで処理を始める
  4. 進捗取得のためのエンドポイントを用意する
    • /api/update/progress にGETアクセスすると progress.txt の中身を返すだけでもOK
  5. JavaScriptで定期的に進捗取得APIを呼んで現状の進捗を取得、表示
 $.ajax({
    url: '/api/update/progress?' + new Date().getTime(), // キャッシュ回避
    success: function(progress) {
      $('#status').text(progress);
    }
  });

※サーバが複数台ある場合なんかだと progress.txt をサーバ間で共有する仕組みとか、
当該処理はリバースプロキシで単一のサーバが処理するようにする、みたいな対策が必要です。

もっと効率的に

KEN_ALL.ZIP 固定ならいちいち人がダウンロード&アップロードしなくてもいいじゃない。
そうなんです。
cron で月1回、wget とか curl とかでダウンロードして自動的に処理を進めてくれればいい。

でもその場合も上記な仕組みで進捗を表示できるようにしておくと
(ちゃんと更新できてるかな?)と思って見に行ったときに
リアルタイムに進捗表示できるのはいいよねーって。

専用のモジュールやライブラリを使ったり、マルチスレッドやプロセス間通信とかに凝るのもいいけど、
昔ながら(?)の手法でローテクにやる方法を覚えておくといつでもサッと使えるよ。というお話。

この記事を書いた人

tama