自作ソフトを並列処理にしてみた

投稿者: | 2021年4月17日

研究室のオンラインミーティング自動開催ツールを弄る回です。

完成当時の実装ですと、RPAツールが例外を飛ばして落ちた瞬間にGUIも落ちるので、これらをスレッドとして分割してRPAツールがGUIに影響を与えないようにします。

1.修正後のコード

2.Pythonの並列処理

threadingというモジュールが用意されています。これを用いると容易に実装できます。

他にもスレッドプールやプロセスルールなどもあります。

今回は、GUIを走らせるスレッドとRPAツールを走らせるスレッドを分けるだけのため、スレッドプールのように同時に動かす最大数を制限する必要はなく、プロセスとして分割してマルチコアで動かす必要もないため、threadingで並列処理を行いました。

3.並列処理の前に

もともとRPAツール部分はGUI内のwhile文内に書かれていました。しかし、threadingで並列処理する場合は、実行する関数とともにTreadクラスをインスタンス化する必要があります。要するに、今回の変更ではRPAツールを関数化する必要がありました。

4.この変数ってグローバル変数の必要ある?

RPAツールの関数化とともに、グローバル環境で宣言している変数についても見直しを行いました。グローバル環境にすべて変数を宣言するのはお行儀が良くないので、できる限りその変数を使う関数内に移動させました。

5.Pythonのグローバル変数を関数内で使う時

グローバル変数とローカル変数に同じ名前をつけることができます。また、関数内で宣言されるとローカル変数と扱われます。関数内でグローバル関数を使う場合は、変数名の前にglobalをつけます。

6.startするのを忘れない

インスタンス化した後、startするのを忘れると意味がないので忘れないようにしましょう。

7.おわりに

調べてすぐにマルチスレッド化できてびっくりしました。でもマルチスレッド化ならC++も比較的簡単だった覚えがあります。

実装予定の機能ができたので、次はログをファイルに出力するようにしたいです。ロギング機能ってのがあるらしい。

8.参考文献

Pythonの並列・並行処理サンプルコードまとめ

threading ---- スレッドベースの並列処理

threading - スレッドによる並列処理を管理する

関数の中でグローバル変数を代入する

Python♪関数で変なエラーが出た:local variable 'x' referenced before assignment

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください