プロセスプールで天気図作成を高速化してみた、その他諸々
TL;DR
色塗り天気図自動作成システムをAtmosChartと命名
プロセスプールを使って天気図生成時間を改善
コードのリファクタリング
リポジトリーをGitHubに移行
AtmosChartと命名
本題の前に・・・
ずっと天気図作成システムの名前を付けていなかった。実家の庭に設置している気温などの観測システムにはAtmosBotと名付けたので、天気図生成システムはAtmosChartと名付けることに。
以前運用していたBash版のシステムをAtmosBot1.0、現在のPython版のシステムをAtmosBot2.0とすることにした。
プロセスプールで天気図の作成時間の改善
こちらが今回の本題・・・
ずっと全ての天気図の作成完了まで時間がかかることを課題と考えていた。以前スレッドプールを使って並列処理をしようとしたけど、天気図が乱れて描画される。原因はMatplotlibがスレッドセーフでなかったこと。プロセスなら問題ないわけ。
ある時ふと浮かんだことがスレッドプールがあるならプロセスプールってあってもいいんじゃない。ググってみたらありました、プロセスプールという機能が。
下記のようなクラスを準備して8個までプロセスプールで並行処理させる。
#!/usr/bin/env python3
# coding: utf-8
from concurrent.futures import ProcessPoolExecutor
class MultiProcess(object):
# コンストラクター
def __init__(self, processes) -> None:
self.__processes = processes
self.__workers = []
# プロセスプールに処理を追加
def add_process(self, worker, args = None) -> None:
func = [worker, args]
self.__workers.append(func)
# プロセスプールを実行する
def exec_processes(self) -> None:
with ProcessPoolExecutor(max_workers = self.__processes) as executor:
l_futures = []
for worker, args in self.__workers:
future = executor.submit(worker, args)
l_futures.append(future)
for future in l_futures:
future.result()
余裕のあったリソースを使って並列処理できるようになってかなり高速化された。
コードのリファクタリング
リファクタリングを始めたのは多分一年少し前。以前は作成する天気図毎にほぼべた書きコードだったけど、クラス化して共通化するなどして整理したらすっきりしてきた。時間がなくてちょっとずつ、プロセスプールの件も含めてやっていたら1年近くかかってしまった。
一旦コミットしたけど、まだ改善の余地はありそうなのでこれからもボチボチ取り組みたい。
GitリポジトリーをGitHubに移行した
これまでコードはRaspberry Pi上にGitサーバーを構築して管理していた。
ストレージが故障してしまうと面倒なのでBoxをWebDAV出マウントした領域にリポジトリーを置いていた。だが、またWebDAVでマウントできなくなっていたことに気づいた。
他のオンラインストレージのサービスで代替できないか調べてみたが、Raspberry Pi上で利用できるサービスが見当たらない。
最終的に行き着いた先がシンプルにGitHub。自分でサーバー管理するのは放棄することにした。
5年以上前に使っていたのでアカウントは持っていたけどずっと放置していた。プライベート・リポジトリーにして使用することにした。
GitHub上でリポジトリーを作成する際に表示されるGitコマンドをローカル・リポジトリーで入力するだけで基本的には移行できる。
$ git remote rm origin # 必要に応じて
$ git remote add origin {GitHubのリポジトリーのURL}
$ git branch -M main
$ git push -u origin main
さいごに
どちらかと言うと技術ネタだけど、久しぶりの天気図関連のnote。
何もしていなかったわけではなく、いろいろと取り組んでいたけどnoteにしていなかったのでまとめて書いてみた。
他にも進行中のものがあるけど、まだまだ時間がかかりそう。年末年始にできるだけ頑張ってみる。
よろしければ、サポートをお願いします。 より多くの方に役立つnoteを書けるよう頑張ります!!