👯

Rust Parallelの使い方

に公開

はじめに

シェルで並列実行を実現するrust-parallelをよく使っているのだが、情報が少ないのでまとめてみる。

インストール

macOSだとHome Brewで簡単にインストールできる。

brew install rust-parallel

それ以外だとcargoからインストールできるのだが、Rustからインストールしないといけないので、Rustを使っていない人には面倒かも。WinGetやChocolatey, aptには入っていないようなので、そこがあまり普及していないポイントだろう。

cargo install rust-parallel

使い方

基本の使い方

GNU Parallelを使ってる人なら簡単に使えるかと思う。
-sで並列化するコマンドを指定、:::でそれぞれの入力を並べる。入力は基本的に標準入力からであるが、{1}でコマンドに含めることもできる。例えば、

rust-parallel -s 'echo {1}' ::: 1 2 3

だと、以下の3つのコマンドを並列に実行する。

echo 1
echo 2
echo 3

二重ループ

:::を並べると二重ループになる。個人的にはあまり使わない。

rust-parallel -s 'echo {1}-{2}' ::: 1 2 3 ::: A B C

出力は以下の通り。並列実行なので順番はバラバラ。

2-A
1-A
3-A
2-B
3-C
3-B
1-B
1-C
2-C

ファイルを入力する

:::の後ろに正規表現を書くと、マッチするファイル名が一覧が入力となる。たとえば、以下だと実行したフォルダのファイル一覧が表示される。

rust-parallel -s 'echo {1}' ::: *

パターンマッチ

-rでパターンマッチを行うことができる。()で括った順番に{1}, {2}で参照できる。
例えば、in/フォルダにあるファイルの中身をpython3 main.pyの標準出力として与えて、その出力をoutフォルダに出力するには以下のようにする。

rust-parallel -r '(.*)/(.*)' -s 'python3 main.py < {1} > {2}' ::: in/*

{0}で元の文字列が参照できるので、.txtを.csvにrenameするときは以下のような感じ。

ust-parallel --dry-run -r '(.*)\.txt' -s 'mv {0} {1}.csv' ::: *.txt

途中経過の表示

-pでプログレスバーをだす。

rust-parallel -p -r '(.*)/(.*)' -s 'python3 main.py < {1} > {2}' ::: in/*

並列度の変更

-jで並列に実行するコマンドの数を指定できる。-j 1を入れて逐次実行にする時によく使う。

rust-parallel -j 1 -p -r '(.*)/(.*)' -s 'python3 main.py < {1} > {2}' ::: in/*

おわりに

情報が少ないrust-parallelについて紹介した。GNU Parallelの方が多機能だし、ほとんどのパッケージマネージャーに含まれているので使いやすいと思う。ただ、rust-parallelの-rオプションまわりは直感的で使いやすい。
Rustで実装されたParallelなのでrust-parallelなのであるが、プログラム名で検索すると、Rustでの並列処理の方法、マルチスレッドライブラリのrayonや非同期ライブラリtokioのページばかりひっかかるのも情報がなかなか見つからない原因かも知れないが...

Discussion