Django のプロジェクトのテストを並列実行してとりあえず2倍高速にした
結果
Django のプロジェクトのテスト実行時間が、 GitHub Actions 上で 10min 超えになっていてつらみが出てきていた。
のを、 manage.py test
の --parallel
オプションを活用することで実行時間を約半分に短縮できた。
やったこと
Django のプロジェクトでおそらくよくお世話になるだろう manage.py test
には --parallel
オプションがある。
読んで字の如くであるが、このオプションを渡すだけで実行環境のコア数分並列実行をしてくれて便利。
Django のテストにおいてはデータベースにべったり依存したテストコードを書くことも多いと思うが、このオプションを渡すと起動時にワーカ分のテストデータベースを自動でいい感じに作ってくれるので、 並列実行におけるデータベース周りへのケアをあまり気にしなくて良くなる。
... Creating test database for alias 'default'... Cloning test database for alias 'default'... Cloning test database for alias 'default'... Cloning test database for alias 'default'... Cloning test database for alias 'default'... ...
自前で並列実行されることを想定されていない共用されると破綻するリソースがあるときは別途対策を入れる。
自分が今回扱ったプロジェクトにおいては、「一時ディレクトリ」「Elasticsearch のインデックス」があった。
この例においてはとりあえず共用リソース名の末尾に f"-{os.getpid()}"
を付与してワーカ毎に異なる名前付けを行うことで回避するようにした。
その他、 --parallel
オプションを使用する上で tblib
などパッケージをインストールすることを求められるケースがある。
これらの工夫で、冒頭のように一定(自分の事例では 2 倍)高速になるなら儲け物ではないだろうか。