こんにちは、ヒガシです。
このページでは、Pythonプログラムを実行中に別のPythonプログラムを呼び出して平行処理する方法をご紹介していきます。
それではさっそくやっていきましょう!
メインプログラムの紹介
まずはメインで実行するプログラムからご紹介していきます。
import time
import datetime
now = datetime.datetime.now()
print(f"main_start: {now:%Y-%m-%d %H:%M:%S}")
time.sleep(5)
now = datetime.datetime.now()
print(f"main_end: {now:%Y-%m-%d %H:%M:%S}")
ただ単に5秒待つだけのプログラムです。
そしてその前後で現在の時刻を表示するようにしています。
このプログラムの実行結果は以下の通りです。
問題なく5秒差で時刻が表示されていますね。
このプログラムに以降で紹介するサブプログラムを平行実行させていきます。
平行実行させるサブプログラムの紹介
次に平行実行させるサブプログラムをご紹介していきます。
import datetime
import time
def sub_func(message):
print(message)
now = datetime.datetime.now()
print(f"sub_start: {now:%Y-%m-%d %H:%M:%S}")
time.sleep(5)
now = datetime.datetime.now()
print(f"sub_end: {now:%Y-%m-%d %H:%M:%S}")
引数(message)を受け取り、それを表示 ( print(message) ) させた後に、メインプログラムと同様に5秒待つというものです。
そして待つ前後の時刻も同様に表示させています。
時刻表示については、メイン側、サブ側でどちらの時刻が表示されているのかをわかるように表示するようにしています。
このサブプログラムを以下のコードで呼び出してみましょう。
from sub_sleep import sub_func
sub_func('sub_function_trial')
以下の結果が出力されました。
問題なく引数として渡したメッセージが表示され、5秒待つ前後の時刻も表示されていますね。
サブプログラムが問題なく動くことが確認できましたので、次は先ほど紹介したメインプログラムとこのサブプログラムを平行実行する方法をご紹介していきます。
平行実行ライブラリの紹介
プログラム紹介に入る前に、今回使用するライブラリをご紹介しておきます。
今回はfrom concurrent.futuresのThreadPoolExecutorというものを使っていきます。
こいつはPythonの標準ライブラリであらかじめインストールされていると思います。
ThreadPoolExecutor().submit(呼び出す関数名, 呼び出し関数の引数)
これで関数だけを呼び出し、その処理完了を待つことなく次の処理に移行できます。
ポイントは引数を渡すときに関数名()で渡すのではなく、第2引数として渡すというところです。
ここは間違いやすいので覚えておきましょう。
メインとサブプログラムの平行実行プログラム
それでは本題である、プログラム実行中にサブプログラムを平行実行するサンプルコードをご紹介します。
基本的には先ほど紹介したメインプログラムの一部を改造するだけでOKです。
from sub_sleep import sub_func
from concurrent.futures import ThreadPoolExecutor
import time
import datetime
now = datetime.datetime.now()
print(f"main_start: {now:%Y-%m-%d %H:%M:%S}")
ThreadPoolExecutor().submit(sub_func, 'ThreadPoolExecutor_Trial!')
time.sleep(5)
now = datetime.datetime.now()
print(f"main_end: {now:%Y-%m-%d %H:%M:%S}")
2行目と7行目に先ほど紹介したスキルが入っていることがわかると思います。
こいつを実行すると以下の結果が得られました。
メインとサブが同時にスタートして、同時に終わっていることがわかると思います。
問題なく平行実行されたことが確認できました。
おわりに
というわけで今回はPythonプログラムから別のプログラムを呼び出して平行実行する方法をご紹介しました。
処理待ちが発生するものに対して非常に有効ですのでぜひやり方をマスターしておきましょう。
このように、私のブログではPythonはもちろん、様々なプログラミングスキルを紹介しています。
ぜひ他の記事ものぞいてみてください。
それではまた!
コメント