【Pythonプログラミング】並列処理の基本を解説!マルチスレッド・マルチプロセスをconcurrent futuresで実装!
Summary
TLDRこのビデオでは、Pythonの並列処理と並行処理の基本的な考え方と、コンカレントフューチャーズモジュールを使った実装方法について解説しています。マルチスレッド、マルチプロセスの違いと、スレッドプールエグゼキューターやプロセスプールエグゼキューターを使用して並行処理・並列処理を実現する方法が紹介されています。関数の引数渡しや戻り値の取得、max_workersの意味など、基本的な内容ですが、処理の効率化に役立つでしょう。
Takeaways
- 😃 並列処理と並行処理の違いと特徴について説明している
- 😊 CPU負荷の高い処理には並列処理、IO負荷の高い処理には並行処理が向いている
- ✨ Pythonのconcurrent.futuresモジュールを使うと簡単に並列/並行処理が実装できる
- ☀️ スレッドプールエグゼキューターを使うとマルチスレッドによる並行処理が実装できる
- 🌈 プロセスプールエグゼキューターを使うとマルチプロセスによる並列処理が実装できる
- 💡 max_workersで同時実行プロセス数を制限できる
- 💫 サブミットで関数を実行、futureで返り値を取得できる
- 🌠 mapで複数の関数実行と引数渡しを簡潔に記述できる
- 🎉 プロセス数の変化から並列/並行処理の動きが確認できる
- 😊 concurrent.futuresの利用で並列/並行処理の活用がしやすくなった
Q & A
並列処理と並行処理の違いは何ですか?
-並列処理はCPU負荷の高い処理を同時に実行できる。並行処理は待ち時間の長い処理を同時に実行できる。
pythonで並列処理を実装するにはどのモジュールが適していますか?
-並列処理にはマルチプロセッシングモジュールかコンカレントフューチャーズが適している。
マルチスレッドとマルチプロセスの違いは何ですか?
-マルチスレッドは1つのプロセス内で複数のスレッドを立ち上げる。マルチプロセスは複数のプロセスを立ち上げる。
コンカレントフューチャーズを使うメリットは何ですか?
-マルチプロセスとマルチスレッドの両方を簡単に実装でき、戻り値の取得なども便利である。
max_workersのパラメータは何の制限値ですか?
-並列処理を行うワーカーの最大数を指定するパラメータ。
並列処理中の関数に引数を渡すにはどうすれば良いですか?
-submitメソッドを呼び出す際に、関数の後ろに引数を指定する。
並列処理中の関数の戻り値を取得するにはどうすれば良いですか?
-submitメソッドの戻り値であるfutureオブジェクトのresultメソッドを呼び出す。
mapメソッドを使うメリットは何ですか?
-for文を使わずに、複数の関数を並列処理できるのでコードがシンプルになる。
プロセスプールエグゼキューターを使う利点は何ですか?
-CPU負荷の高い並列処理ができる。マルチプロセスなので安定性も高い。
並列処理を使う場面の例を教えてください。
-大量のデータ処理、機械学習モデルの学習、Web API利用など待ち時間の発生する処理に有効。
Outlines
😀並列処理の基本的な考え方
<paragraph1>では、並列処理と逐次処理の違いについて、作業車と作業者の比喩を使って分かりやすく説明しています。CPUバウンドな処理とIOバウンドな処理の違いも説明しています。また、並列処理と並行処理の違いについても触れています。
😀マルチスレッドによる並行処理
<paragraph2>では、コンカレントフューチャーズを使ったマルチスレッドによる並行処理の実装方法を解説しています。スレッドプールエグゼキューターを使って複数の関数を並行処理させる方法や、関数への引数の渡し方、戻り値の取得方法などを説明しています。
😀並行処理の数の調整
<paragraph3>では、max_workers引数で並行処理数を制限できること、並行処理させる関数をfor文で複数指定する方法、mapメソッドを使う方法など、並行処理数を調整する方法を解説しています。また並行処理した関数からの戻り値を取得する方法も説明しています。
😀マルチプロセスへの変更
<paragraph4>では、マルチスレッドのコードをマルチプロセスで動作するように変更する場合、スレッドプールエグゼキューターをプロセスプールエグゼキューターに変更するだけで良いことを説明しています。また、プロセスの数をタスクマネージャーで確認する方法も解説しています。
Mindmap
Keywords
💡並列処理
💡並行処理
💡逐次処理
💡マルチプロセス
💡マルチスレッド
💡CPUバウンド
💡IOバウンド
💡concurrent.futures
💡ProcessPoolExecutor
💡ThreadPoolExecutor
Highlights
並列処理と並行処理の基本的な考え方とモジュールの基本的な使い方を説明
並列処理はCPUを大量に消費する処理に向いている
並行処理は待ち時間が長い処理に向いている
コンカレントフューチャーズを使うとマルチスレッドとマルチプロセスの並列/並行処理が簡単に実装できる
Transcripts
こんにちは倍三部市場のさとです今回は
iphone の並列処理が扱える
コンカレント future も10連
ツイで解説したいと思います
並列処理並行処理の基本的な考え方と
モジュールの基本的な使い方を説明して
いくので是非最後まで見てみてください
このチャンネルは python に関の
情報を発信しているので良ければ
チャンネル登録よろしくお願いします
またペンバーセット会員しか見れない
ライブ動画もあるので興味がある方は
メンバーシップのご健闘をもよろしくお
願いします
まず今回のテーマである並列処理について
簡単に説明します
今までさプーの動画の中で解説していた
普通のコードっていコードが書かれている
上から順番に処理が実行されて前の処理が
終わってから次の処理が実行されますよね
例えばテキスト1っていうファイルと
テキスト日給ファイルを読み込む処理が
あってこんな風に読み込み処理を順番に
書いていた場合テキスト1が読み終わって
から
へリストにを読み込みが始まりますこう
いうのを逐次処理入っていますでもこの
会える読み込みにすごい時間がかかるかラ
同時に2つのファイルを読み込んで処理
時間を短縮したいなーって時ありませんか
そんな時こんな風に複数の処理を同時に
実行する
並列処理っていうのを使います
イメージとして逐次処理は単一の作業車
単一のワーカーが一つずつ順番に処理を
こなしているというイメージですが a 列
処理は複数の作業車
9数のバーカーでそれぞれ同人処理を
こなすというイメージです
また作業者はパン5なんですが書類の中で
発生する待ち時間を使ってその待ち時間の
間に別の処理を挟み込んでこなしちゃう
って言うこういうやり方を並行処理てい
ます
並行処理も外から見ると同時に服装の作業
が処理されているように見えますね
さらにこういった並列処理並行処理用
コンピューター上で実現するにはある家
プロセスっていう方法とマルチスレッド
っていう実装方法がありますまずマルチ
プロセスは複数のプロセそう使うっていう
意味なんですがこのプロセスっていうのは
音ピューター上で動いている処理の単位の
ことで例えば excel を立ち上げる
と excel のプロセスが一つの
立ち上がります windows の人は
タスクマネージャー
mac の人はアクティビティモニターを
起動させると今自分の数ど根性でどんな
プロセスが立ち上がっているのかが分かり
ます
なのでふつうは python の
プログラムを実行するとこんな風に一つの
パイソンのプロセスが立ち上がるんですが
このプロセスを複数立ち上げてそれぞれで
処理をさせるこれがマルチプロセスを使っ
た方法です次にマルチ数8っていうのはう
すーのスレッドを使った処理っていう意味
ですがスレッドっていうのはプロセスの中
のさらに分発下処理の単位を言います
つまり excel を起動してエクセル
のプロセスが一つ立ち上がるとその中で
必要な書類に応じて複数のスレッドが作成
されるっていう感じですね
で python の場合はマルチ
プロセスを使うと並列処理になって
マルチスレッドを使うと並行処理になり
ますちなみに並行処理超並列処理ってどう
やって使い分けるなぁって感じだと思うん
ですが
並列処理は cpu 理想草を大量に消費
するような処理
たとえば大量の数字計算処理などを同時に
行うのに向いていますこういうのを cpu
バウンドな処理っていう言い方をします
一方並行車よれば待ち時間が長いような
処理つまり web api の利用とか
ディスクへの書き込みとかこういった処理
を同時に行わに向いていますこういうのを
io バウンドな処理っていう言い方をし
ます
ちょっといろいろな言葉が出てきたので
一旦整理してみると
マルチプロセスは並列処理が実装できて
これは cpu バウンドなぁ署員に向い
ていて python の場合
マルチスレッドは栄光処理が実装できて
これは io バウンドなぁ処理に向いて
いるこういう形になりますねじゃあ実際に
マルチプロセス
マルチスレッドをどんな風にpython
で実装したら良いかっていうと
python にはマルチプロセスが実装
できるマルチプロセッシングっていう標準
モジュールと
マルチスレッドが実装できる
スレッディングて標準モジュールが存在し
ますでさらにある家 processing
鳥栖レッティングをまとめたコンカレント
フューチャーズっていう表示モジュールが
パイソン3.2から登場しました
なので今回はマルチプロセスも
マルチスレッドも扱える本 current
フューチャーズの使い方について解説して
いきたいとおもいます
ではまずコンカレントフューチャーズで
マルチスレッドを使う報道を説明します
from コンカレントフューチャーズ
インポートスレッドプールペグ瀬宮
たーーーーで
スレッドプールエグゼキュータークラスを
インポートします次に並行で処理させる
ファンク1っていう関数とファンク日給
関数を作りますファンク市の関数では2秒
スリップしてパンク1-0指をスリープし
てファンク1-1指をスリープして
ファンク市にって出力する関数で0
ファンクにの関数は1秒スリープして
ファンク2-01秒スリープ視点ファンク
2-1
一部をスリープしてファン国に出力する
関数ですこの2つの関数の処理を並行で
処理させたいと思いますいつもみたいに
いる name ==メインで main
関数
を呼び出して main 関数の中で
with スレッドプールいる請求たああ
max ワーカーズ=にあず f
secure
っていう日付くを書きますこのスレッド
プールセキュラーの引数の max
ワーカーズは同時に処理を実施する最大の
ワーカー作業車っていう意味であとでこの
数値をいじる等どうなるか解説するんです
が今はいったん2つの処理を同時に行い
たいのでにっていう風に設定します
この with 口の中に
エグゼキューターのサブミットメソッドの
引数に並行処理で実行したい関数をたし
ます
今回の場合は一つ目はアンク1次の行に2
つ目のファンクにを指定して
エグゼキューターのサブミットを呼び出し
ます
このサブミットを呼び出した時点でこの
ああ61とパンクには並行処理が開始し
ます
なのでこのコードを実行するとこんな風に
ファンク市プリントの結果とパンクにの
プリントの結果が混ざって出力されます
つまりファンク1 it fun 国が
栄光処理で動いているのがわかります
それでは実際にお菓子て本当に並行処理
最低のか確認してみましょう
さっき開設したコートと全く同じ行動を
書きました
61とファンク2 o
マルチスレッドで並行処理で実行する
コードになります
実際にこれを実行してみると
こんな風にファンク市とファンクにの出力
が混ざって出力されて
ファンク1もファンクにも同時に動いて
いるのがわかりますねちなみに水区の外で
はいつも通りの逐次処理になっているので
例えば
ビズの前に
プリントを返しいっていうふうに改定
ビズを抜けてからプリント終了って書いて
またこれを実行してみると
並行処理が実施される前に反しって表示さ
れて並行処理が終わってから終了って表示
されます
どうでしょう
実相自体はそんなに難しくないんですよね
ちなみに関数に引数を渡したい場合はサブ
ミットの引数乱数の後ろに順番に引数を
指定すれば ok です
例えば
関数のにの方は引数 x と by を
受け取るような関数だったどうします
でプリントで表示する時に何時で受け取っ
たエップスとワイも表示させるように変更
してこの案国を並行所為で呼び出す時に
引数を渡すためにアート a というふう
に後ろに引数を指定するとこのあの部分が
x に渡されて
の部分が前に渡されます
この状態でもう一度を動かしてみると
ファンクにのところに引数で私た値が表示
されているので奇数がちゃんとわたって
いることが分かりますねー
また戻り値を取得したい場合は
関数がは普通に戻り値を設定してあげて寒
ミントメソッドを呼び出した結果を
フューチャー1ビューチャーにっていう
変数にそれぞれ代入しますサブミット
メソッドの戻り値はフューチャー
オブジェクトになっているんですが
future オブジェクトのリザルト
メソッド呼び出すとそれぞれの戻り値が
取得できます
なので
何處を抜けたところで
future 市とフューチャーにの
レザールとメソッドをそれぞれ呼び出して
それを最後に表示させるようなプログラム
に変更してみましたこの状態でもう一度
実行してみると
さっきと同じように並行処理が実施されて
最後にファンク市とファン国もよりティが
表示されたので戻り値が取得できたのが
わかります
あとは先ほど
とりあえず max ワーカーズっていう
引数をに設定しましょうっていう風に説明
したんですがこれはどういうことかという
と並行処理を実施する作業車
ワーカーが最大2つだよということです
なので例えば今みたいに2つの処理を傾向
を処理しようとして max ワーカーズ
を音にするとバーカーが2つあるので2つ
の処理が同時に対しされて並行処理が実施
されます
でももしも max ワーカーズがの状態
で3つの処理を並行処理しようとすると
初めに2つの処理が同時に開始してその
うちの一つの処理が終了して作業に空きが
出たワーカーが3つ目の処理を並行処理
するこういうイメージです実際にまあ薄
ワーカーがにの状態でもう1その並行処理
としてアン国の引数がいいと b という
処理を作っていづくの中で3つ目の並行
処理として設定してこれを実行したいと
思いますこれを実際に実行してみると
こんな感じでファンク市とアンクに引数が
あ
が動いてスリープが1秒だ割るファンクに
喘いが先に終わってその本当にファンク2
eb が動く実際にさっき説明した通りの
動きになっていますね
どうでしょう
max ワーカーの意味が分かりましたか
ね
また全く同じ関数の処理を4つ並行処理し
たいっていうときとかは
こんな風に for 文を使って with
口の中でエグゼキューターのサブミットを
4回呼び出せば ok ってことですね
1区1-この関数を
引数を一つとってプリント中で表示させる
こんな関数に変更させてこのファンク市の
引数に a b c d っていう値が
入るようにして4回呼び出されるようにし
ますで max ワーカーズは4に変更し
てこれを実行してみいると
こんな風に奇数で a を受け取った処理
費数で bo を受け取った処理引数で c
を受け取った処理引数で ad を
受け取った処理これらが同時に開始して
並行処理されているのが分かりますまた
これをもう少し簡単に各 map って
いうのがあって
web セキュラーのマップの引数に実行
したい関数その後ろに関数に渡したい引数
をレストとして渡します
この1文でそっちの桜軍と全く同じ処理に
なりますこちらも実際に動かしてみると
さっきと同じように引数を
abcd で受け取った処理が4つ同時に
並行処理されているのがわかりますね
またマップを使って並行処理する関数の
戻り値を取得する場合例えば
ファンク市の戻り値が
結果ハイフン位数で渡された値っていう風
にしておいてい
マップの戻り値を
れざるツっていう変数に代入しておきます
この戻り値はロック処理の戻り値の
ジェネレーターになっているので隷属を
抜けツアーとにレストに変換して表示して
みようと思いますこれをもう一度実行して
みると
それぞれの温度市が取得できているのが
わかりますね次にここまでマルチスレッド
で実装していたものをマルチプロセスに
変更したいと思いますコンカレント
フューチャーズ大津かわいいこの
マルチスレッドようで作った方のスレッド
プールエグゼキューターを
プロセスプールエグゼキューターに変更
するだけで ok です
引数や戻り値
マップを使った方法なども全く同じ高度で
動きます
python 3点によりも前のそれっ
てぃんぐやマルチプロセッシングを使う
場合と違ってとっても便利ですよね
ファンク市は戻り値を返す関数でファンク
には引数をあしても土居町回送な関数にし
て
スレッドプールエグゼキューターを
プロセスプールエグゼキューターに変更し
てある家プロセスの並列処理で実行される
ように変更してまたこれを実行してみると
こちらはマルチプロセスで並列処理が実行
されました
ちなみにこのプロセスプール
エグゼキューターを使って並列処理を実行
している間に windows のアスク
マネージャー南区のアクティモニターを見
てみるとプロセスが複数立ち上がっている
のが分かると思いますぜひお手元の環境で
ステップルールエグゼキューターと
プロセスプールエグゼキューターで
プロセスの数がどう変化しているのかぜひ
見てみてください
今回の動画は以上になります
今回は並列処理並行処理の基本的な部分
だけでしたが今回の内容だけでもいろいろ
なケースで処理のスピードアップ
効率化に役立てられると思うので是非気概
があれば使ってみてくださいそれではまた
次回の動画でお会いしましょう
ever
5.0 / 5 (0 votes)