Chienomi

qargs

開発::noddy

qargsはキューによってコマンドを反復実行するものである。

mmutilsにあるmmffrも似たような目的であるが、mmffrはffmpeg専用であるし、前提としてmmutilsが複数マシンでの分散を想定したものだが、qargsは実行時間に差があるコマンドを並列実行することを想定しており、特にダウンロード系の処理において利用するのに適している。

コード解説

コード自体は非常にシンプルで、エンキューコマンドとデキューコマンドの2つからなる。

エンキューコマンドはキューを生成するとともにUnixサーバーとなり、デキューコマンドの要求を待ち受けるデーモンとなる。 Unixソケットの接続があればキュー配列から1つshiftして返す、という構造だ。

一方デキューコマンドはUnixソケットに接続し、キューからアイテムを1つ受け取り、引数として与えられたコマンドにアイテムを引数として追加した上で実行する、ということを繰り返す。 この実行形式が適合しないものについては、ラッパースクリプトを必要とする。だが、そもそもの話としてラッパースクリプトのヘルパーみたいな存在なので、機能を追加するよりもこのほうが良いだろう。

キューが空になった場合、エンキューコマンド、デキューコマンドともに終了する。 (デキューコマンドは単純化のため、例外捕捉で抜けている。)

こういうものは既にありそうに思えるが、探してもみつからなかったので、作ってみた。

実践的な利用例

直列で実行する場合はこのようなことができるものとする。

for i in **/.download.zsh
do
  (
    cd ${i:h}
    zsh .download.zsh
  )
done

この内容をラッパースクリプトにする。

cd ${1:h}
zsh .download.zsh

tmuxで3並列で投げっぱなしにする。

tmux new-session "qargs.rb download dlhelper.zsh" \; split-window "qargs.rb download dlhelper.zsh" \; split-window "qargs.rb download dlhelper.zsh" \; detach-client

進捗を見たいときは

tmux a

そのまま閉じるか、デタッチしてしまえば続行される(走っているプロセスを終了してしまわないように注意)。 これで並列ダウンロードが捗るだろう。 (もちろん、相手側に負担のかかるようなダウンロードや、禁止されているダウンロードはしないこと。)