【Pythonプログラミング】並列処理の基本を解説!マルチスレッド・マルチプロセスをconcurrent futuresで実装!

Pythonプログラミング VTuber サプー
24 Apr 202215:53

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

00:00

😀並列処理の基本的な考え方

<paragraph1>では、並列処理と逐次処理の違いについて、作業車と作業者の比喩を使って分かりやすく説明しています。CPUバウンドな処理とIOバウンドな処理の違いも説明しています。また、並列処理と並行処理の違いについても触れています。

05:00

😀マルチスレッドによる並行処理

<paragraph2>では、コンカレントフューチャーズを使ったマルチスレッドによる並行処理の実装方法を解説しています。スレッドプールエグゼキューターを使って複数の関数を並行処理させる方法や、関数への引数の渡し方、戻り値の取得方法などを説明しています。

10:02

😀並行処理の数の調整

<paragraph3>では、max_workers引数で並行処理数を制限できること、並行処理させる関数をfor文で複数指定する方法、mapメソッドを使う方法など、並行処理数を調整する方法を解説しています。また並行処理した関数からの戻り値を取得する方法も説明しています。

15:02

😀マルチプロセスへの変更

<paragraph4>では、マルチスレッドのコードをマルチプロセスで動作するように変更する場合、スレッドプールエグゼキューターをプロセスプールエグゼキューターに変更するだけで良いことを説明しています。また、プロセスの数をタスクマネージャーで確認する方法も解説しています。

Mindmap

Keywords

💡並列処理

複数の処理を同時に実行すること。CPUの複数のコアを利用して、処理の速度を上げることができる。この動画では並列処理を実現する方法として、マルチプロセスとマルチスレッドが説明されている。

💡並行処理

待ち時間が発生する処理において、その待ち時間を利用して別の処理を同時に実行すること。IOバウンドな処理に向いている。この動画ではマルチスレッドを使うことで実現できると説明されている。

💡逐次処理

プログラムが上から順に実行される通常の処理。並列処理や並行処理と対比される概念。

💡マルチプロセス

複数のプロセスを利用することで並列処理を実現する方法。CPUバウンドな処理に向いている。この動画ではconcurrent.futuresモジュールを使うことで簡単に実装できると説明されている。

💡マルチスレッド

1つのプロセスの中で複数のスレッドを生み出し、並行処理を実現する方法。IOバウンドな処理に向いている。この動画ではconcurrent.futuresモジュールを使うことで簡単に実装できると説明されている。

💡CPUバウンド

CPUの処理能力の限界に制約されるような処理。並列処理によって速度改善が期待できる。

💡IOバウンド

入出力やネットワークアクセスなどの待ち時間の影響を大きく受ける処理。並行処理によって速度改善が期待できる。

💡concurrent.futures

Pythonの標準ライブラリの1つ。スレッドとプロセスを使った並行/並列処理を簡単に記述できる。本動画でその基本的な使い方が解説されている。

💡ProcessPoolExecutor

concurrent.futuresで提供されるクラスの1つ。マルチプロセスによる並列処理を簡単に実装できる。動画内で並列処理の例として紹介されている。

💡ThreadPoolExecutor

concurrent.futuresで提供されるクラスの1つ。マルチスレッドによる並行処理を簡単に実装できる。動画内で並行処理の例として紹介されている。

Highlights

並列処理と並行処理の基本的な考え方とモジュールの基本的な使い方を説明

並列処理はCPUを大量に消費する処理に向いている

並行処理は待ち時間が長い処理に向いている

コンカレントフューチャーズを使うとマルチスレッドとマルチプロセスの並列/並行処理が簡単に実装できる

Transcripts

play00:00

こんにちは倍三部市場のさとです今回は

play00:03

iphone の並列処理が扱える

play00:06

コンカレント future も10連

play00:08

ツイで解説したいと思います

play00:10

並列処理並行処理の基本的な考え方と

play00:13

モジュールの基本的な使い方を説明して

play00:16

いくので是非最後まで見てみてください

play00:18

このチャンネルは python に関の

play00:20

情報を発信しているので良ければ

play00:23

チャンネル登録よろしくお願いします

play00:25

またペンバーセット会員しか見れない

play00:27

ライブ動画もあるので興味がある方は

play00:29

メンバーシップのご健闘をもよろしくお

play00:31

願いします

play00:33

まず今回のテーマである並列処理について

play00:37

簡単に説明します

play00:39

今までさプーの動画の中で解説していた

play00:42

普通のコードっていコードが書かれている

play00:45

上から順番に処理が実行されて前の処理が

play00:48

終わってから次の処理が実行されますよね

play00:52

例えばテキスト1っていうファイルと

play00:54

テキスト日給ファイルを読み込む処理が

play00:57

あってこんな風に読み込み処理を順番に

play01:00

書いていた場合テキスト1が読み終わって

play01:03

から

play01:04

へリストにを読み込みが始まりますこう

play01:06

いうのを逐次処理入っていますでもこの

play01:10

会える読み込みにすごい時間がかかるかラ

play01:13

同時に2つのファイルを読み込んで処理

play01:15

時間を短縮したいなーって時ありませんか

play01:18

そんな時こんな風に複数の処理を同時に

play01:22

実行する

play01:23

並列処理っていうのを使います

play01:26

イメージとして逐次処理は単一の作業車

play01:30

単一のワーカーが一つずつ順番に処理を

play01:33

こなしているというイメージですが a 列

play01:36

処理は複数の作業車

play01:38

9数のバーカーでそれぞれ同人処理を

play01:41

こなすというイメージです

play01:43

また作業者はパン5なんですが書類の中で

play01:47

発生する待ち時間を使ってその待ち時間の

play01:50

間に別の処理を挟み込んでこなしちゃう

play01:53

って言うこういうやり方を並行処理てい

play01:56

ます

play01:57

並行処理も外から見ると同時に服装の作業

play02:01

が処理されているように見えますね

play02:03

さらにこういった並列処理並行処理用

play02:06

コンピューター上で実現するにはある家

play02:09

プロセスっていう方法とマルチスレッド

play02:11

っていう実装方法がありますまずマルチ

play02:15

プロセスは複数のプロセそう使うっていう

play02:18

意味なんですがこのプロセスっていうのは

play02:21

音ピューター上で動いている処理の単位の

play02:24

ことで例えば excel を立ち上げる

play02:27

と excel のプロセスが一つの

play02:29

立ち上がります windows の人は

play02:31

タスクマネージャー

play02:33

mac の人はアクティビティモニターを

play02:35

起動させると今自分の数ど根性でどんな

play02:38

プロセスが立ち上がっているのかが分かり

play02:40

ます

play02:41

なのでふつうは python の

play02:43

プログラムを実行するとこんな風に一つの

play02:46

パイソンのプロセスが立ち上がるんですが

play02:48

このプロセスを複数立ち上げてそれぞれで

play02:52

処理をさせるこれがマルチプロセスを使っ

play02:55

た方法です次にマルチ数8っていうのはう

play02:58

すーのスレッドを使った処理っていう意味

play03:01

ですがスレッドっていうのはプロセスの中

play03:04

のさらに分発下処理の単位を言います

play03:07

つまり excel を起動してエクセル

play03:10

のプロセスが一つ立ち上がるとその中で

play03:12

必要な書類に応じて複数のスレッドが作成

play03:15

されるっていう感じですね

play03:17

で python の場合はマルチ

play03:19

プロセスを使うと並列処理になって

play03:22

マルチスレッドを使うと並行処理になり

play03:24

ますちなみに並行処理超並列処理ってどう

play03:28

やって使い分けるなぁって感じだと思うん

play03:30

ですが

play03:31

並列処理は cpu 理想草を大量に消費

play03:35

するような処理

play03:36

たとえば大量の数字計算処理などを同時に

play03:39

行うのに向いていますこういうのを cpu

play03:43

バウンドな処理っていう言い方をします

play03:46

一方並行車よれば待ち時間が長いような

play03:49

処理つまり web api の利用とか

play03:53

ディスクへの書き込みとかこういった処理

play03:55

を同時に行わに向いていますこういうのを

play03:58

io バウンドな処理っていう言い方をし

play04:01

ます

play04:02

ちょっといろいろな言葉が出てきたので

play04:04

一旦整理してみると

play04:06

マルチプロセスは並列処理が実装できて

play04:09

これは cpu バウンドなぁ署員に向い

play04:12

ていて python の場合

play04:14

マルチスレッドは栄光処理が実装できて

play04:17

これは io バウンドなぁ処理に向いて

play04:20

いるこういう形になりますねじゃあ実際に

play04:23

マルチプロセス

play04:24

マルチスレッドをどんな風にpython

play04:26

で実装したら良いかっていうと

play04:29

python にはマルチプロセスが実装

play04:31

できるマルチプロセッシングっていう標準

play04:34

モジュールと

play04:35

マルチスレッドが実装できる

play04:37

スレッディングて標準モジュールが存在し

play04:39

ますでさらにある家 processing

play04:42

鳥栖レッティングをまとめたコンカレント

play04:44

フューチャーズっていう表示モジュールが

play04:47

パイソン3.2から登場しました

play04:50

なので今回はマルチプロセスも

play04:52

マルチスレッドも扱える本 current

play04:54

フューチャーズの使い方について解説して

play04:56

いきたいとおもいます

play05:00

ではまずコンカレントフューチャーズで

play05:02

マルチスレッドを使う報道を説明します

play05:05

from コンカレントフューチャーズ

play05:07

インポートスレッドプールペグ瀬宮

play05:09

たーーーーで

play05:10

スレッドプールエグゼキュータークラスを

play05:12

インポートします次に並行で処理させる

play05:16

ファンク1っていう関数とファンク日給

play05:18

関数を作りますファンク市の関数では2秒

play05:22

スリップしてパンク1-0指をスリープし

play05:25

てファンク1-1指をスリープして

play05:27

ファンク市にって出力する関数で0

play05:31

ファンクにの関数は1秒スリープして

play05:33

ファンク2-01秒スリープ視点ファンク

play05:36

2-1

play05:37

一部をスリープしてファン国に出力する

play05:39

関数ですこの2つの関数の処理を並行で

play05:44

処理させたいと思いますいつもみたいに

play05:47

いる name ==メインで main

play05:50

関数

play05:51

を呼び出して main 関数の中で

play05:53

with スレッドプールいる請求たああ

play05:56

max ワーカーズ=にあず f

play05:59

secure

play06:00

っていう日付くを書きますこのスレッド

play06:03

プールセキュラーの引数の max

play06:05

ワーカーズは同時に処理を実施する最大の

play06:09

ワーカー作業車っていう意味であとでこの

play06:12

数値をいじる等どうなるか解説するんです

play06:14

が今はいったん2つの処理を同時に行い

play06:17

たいのでにっていう風に設定します

play06:20

この with 口の中に

play06:22

エグゼキューターのサブミットメソッドの

play06:24

引数に並行処理で実行したい関数をたし

play06:28

ます

play06:29

今回の場合は一つ目はアンク1次の行に2

play06:33

つ目のファンクにを指定して

play06:35

エグゼキューターのサブミットを呼び出し

play06:37

ます

play06:38

このサブミットを呼び出した時点でこの

play06:40

ああ61とパンクには並行処理が開始し

play06:43

ます

play06:44

なのでこのコードを実行するとこんな風に

play06:48

ファンク市プリントの結果とパンクにの

play06:51

プリントの結果が混ざって出力されます

play06:54

つまりファンク1 it fun 国が

play06:56

栄光処理で動いているのがわかります

play06:59

それでは実際にお菓子て本当に並行処理

play07:02

最低のか確認してみましょう

play07:05

さっき開設したコートと全く同じ行動を

play07:08

書きました

play07:10

61とファンク2 o

play07:12

マルチスレッドで並行処理で実行する

play07:15

コードになります

play07:17

実際にこれを実行してみると

play07:23

こんな風にファンク市とファンクにの出力

play07:26

が混ざって出力されて

play07:28

ファンク1もファンクにも同時に動いて

play07:30

いるのがわかりますねちなみに水区の外で

play07:34

はいつも通りの逐次処理になっているので

play07:37

例えば

play07:38

ビズの前に

play07:40

プリントを返しいっていうふうに改定

play07:44

ビズを抜けてからプリント終了って書いて

play07:47

またこれを実行してみると

play07:58

並行処理が実施される前に反しって表示さ

play08:01

れて並行処理が終わってから終了って表示

play08:04

されます

play08:06

どうでしょう

play08:06

実相自体はそんなに難しくないんですよね

play08:10

ちなみに関数に引数を渡したい場合はサブ

play08:14

ミットの引数乱数の後ろに順番に引数を

play08:17

指定すれば ok です

play08:19

例えば

play08:21

関数のにの方は引数 x と by を

play08:24

受け取るような関数だったどうします

play08:27

でプリントで表示する時に何時で受け取っ

play08:30

たエップスとワイも表示させるように変更

play08:33

してこの案国を並行所為で呼び出す時に

play08:36

引数を渡すためにアート a というふう

play08:40

に後ろに引数を指定するとこのあの部分が

play08:44

x に渡されて

play08:47

の部分が前に渡されます

play08:50

この状態でもう一度を動かしてみると

play09:00

ファンクにのところに引数で私た値が表示

play09:04

されているので奇数がちゃんとわたって

play09:06

いることが分かりますねー

play09:08

また戻り値を取得したい場合は

play09:11

関数がは普通に戻り値を設定してあげて寒

play09:15

ミントメソッドを呼び出した結果を

play09:17

フューチャー1ビューチャーにっていう

play09:19

変数にそれぞれ代入しますサブミット

play09:22

メソッドの戻り値はフューチャー

play09:24

オブジェクトになっているんですが

play09:26

future オブジェクトのリザルト

play09:27

メソッド呼び出すとそれぞれの戻り値が

play09:30

取得できます

play09:31

なので

play09:32

何處を抜けたところで

play09:34

future 市とフューチャーにの

play09:36

レザールとメソッドをそれぞれ呼び出して

play09:38

それを最後に表示させるようなプログラム

play09:41

に変更してみましたこの状態でもう一度

play09:44

実行してみると

play09:53

さっきと同じように並行処理が実施されて

play09:55

最後にファンク市とファン国もよりティが

play09:58

表示されたので戻り値が取得できたのが

play10:01

わかります

play10:03

あとは先ほど

play10:04

とりあえず max ワーカーズっていう

play10:06

引数をに設定しましょうっていう風に説明

play10:08

したんですがこれはどういうことかという

play10:11

と並行処理を実施する作業車

play10:14

ワーカーが最大2つだよということです

play10:17

なので例えば今みたいに2つの処理を傾向

play10:20

を処理しようとして max ワーカーズ

play10:23

を音にするとバーカーが2つあるので2つ

play10:26

の処理が同時に対しされて並行処理が実施

play10:29

されます

play10:30

でももしも max ワーカーズがの状態

play10:33

で3つの処理を並行処理しようとすると

play10:35

初めに2つの処理が同時に開始してその

play10:40

うちの一つの処理が終了して作業に空きが

play10:43

出たワーカーが3つ目の処理を並行処理

play10:47

するこういうイメージです実際にまあ薄

play10:50

ワーカーがにの状態でもう1その並行処理

play10:53

としてアン国の引数がいいと b という

play10:57

処理を作っていづくの中で3つ目の並行

play11:01

処理として設定してこれを実行したいと

play11:03

思いますこれを実際に実行してみると

play11:15

こんな感じでファンク市とアンクに引数が

play11:18

play11:19

が動いてスリープが1秒だ割るファンクに

play11:23

喘いが先に終わってその本当にファンク2

play11:27

eb が動く実際にさっき説明した通りの

play11:31

動きになっていますね

play11:32

どうでしょう

play11:34

max ワーカーの意味が分かりましたか

play11:35

play11:36

また全く同じ関数の処理を4つ並行処理し

play11:39

たいっていうときとかは

play11:41

こんな風に for 文を使って with

play11:44

口の中でエグゼキューターのサブミットを

play11:46

4回呼び出せば ok ってことですね

play11:49

1区1-この関数を

play11:53

引数を一つとってプリント中で表示させる

play11:56

こんな関数に変更させてこのファンク市の

play12:00

引数に a b c d っていう値が

play12:04

入るようにして4回呼び出されるようにし

play12:06

ますで max ワーカーズは4に変更し

play12:10

てこれを実行してみいると

play12:20

こんな風に奇数で a を受け取った処理

play12:23

費数で bo を受け取った処理引数で c

play12:27

を受け取った処理引数で ad を

play12:29

受け取った処理これらが同時に開始して

play12:32

並行処理されているのが分かりますまた

play12:35

これをもう少し簡単に各 map って

play12:38

いうのがあって

play12:40

web セキュラーのマップの引数に実行

play12:42

したい関数その後ろに関数に渡したい引数

play12:46

をレストとして渡します

play12:49

この1文でそっちの桜軍と全く同じ処理に

play12:53

なりますこちらも実際に動かしてみると

play13:04

さっきと同じように引数を

play13:06

abcd で受け取った処理が4つ同時に

play13:09

並行処理されているのがわかりますね

play13:12

またマップを使って並行処理する関数の

play13:15

戻り値を取得する場合例えば

play13:18

ファンク市の戻り値が

play13:21

結果ハイフン位数で渡された値っていう風

play13:25

にしておいてい

play13:26

マップの戻り値を

play13:28

れざるツっていう変数に代入しておきます

play13:31

この戻り値はロック処理の戻り値の

play13:34

ジェネレーターになっているので隷属を

play13:36

抜けツアーとにレストに変換して表示して

play13:39

みようと思いますこれをもう一度実行して

play13:42

みると

play13:53

それぞれの温度市が取得できているのが

play13:55

わかりますね次にここまでマルチスレッド

play13:59

で実装していたものをマルチプロセスに

play14:01

変更したいと思いますコンカレント

play14:04

フューチャーズ大津かわいいこの

play14:07

マルチスレッドようで作った方のスレッド

play14:09

プールエグゼキューターを

play14:12

プロセスプールエグゼキューターに変更

play14:14

するだけで ok です

play14:16

引数や戻り値

play14:17

マップを使った方法なども全く同じ高度で

play14:20

動きます

play14:21

python 3点によりも前のそれっ

play14:24

てぃんぐやマルチプロセッシングを使う

play14:25

場合と違ってとっても便利ですよね

play14:28

ファンク市は戻り値を返す関数でファンク

play14:32

には引数をあしても土居町回送な関数にし

play14:36

play14:37

スレッドプールエグゼキューターを

play14:40

プロセスプールエグゼキューターに変更し

play14:42

てある家プロセスの並列処理で実行される

play14:46

ように変更してまたこれを実行してみると

play14:57

こちらはマルチプロセスで並列処理が実行

play15:00

されました

play15:01

ちなみにこのプロセスプール

play15:03

エグゼキューターを使って並列処理を実行

play15:06

している間に windows のアスク

play15:08

マネージャー南区のアクティモニターを見

play15:11

てみるとプロセスが複数立ち上がっている

play15:13

のが分かると思いますぜひお手元の環境で

play15:17

ステップルールエグゼキューターと

play15:19

プロセスプールエグゼキューターで

play15:21

プロセスの数がどう変化しているのかぜひ

play15:24

見てみてください

play15:27

今回の動画は以上になります

play15:29

今回は並列処理並行処理の基本的な部分

play15:32

だけでしたが今回の内容だけでもいろいろ

play15:35

なケースで処理のスピードアップ

play15:37

効率化に役立てられると思うので是非気概

play15:39

があれば使ってみてくださいそれではまた

play15:42

次回の動画でお会いしましょう

play15:44

ever

Rate This

5.0 / 5 (0 votes)

Do you need a summary in English?