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

  Рет қаралды 40,549

Pythonプログラミング VTuber サプー

Pythonプログラミング VTuber サプー

Күн бұрын

Pythonプログラミングに関する情報を発信しているサプーです!
この動画はPythonで並列処理が実装できる concurrent futuresモジュールの基本的な使い方を解説しています 😊
・並行処理・並列処理とは?
・CPUバウンド・I/Oバウンドとは?
・マルチスレッド・マルチプロセスの実装方法
これらを解説しているので、ぜひ最後までご覧ください✨✨
💙 メンバーシップ 💙
説明動画 ▶︎ • 【ご報告】本日からメンバーシップ開始します!...
登録 ▶︎ / @pythonvtuber9917
iPhoneの方はこらから ▶︎ PythonSuppl/statu...
💻 動作環境 💻
Windows 10
Python 3.9.0
⭐️ チャプター ⭐️
0:00 今日のテーマ「並列処理」
0:33 並列処理とは?
5:00 マルチスレッド
8:10 引数・戻り値があるマルチスレッド
10:02 max_workersについて
11:36 mapの使い方
13:57 マルチプロセス
15:27 エンディング
💜 チャンネル説明 💜
Pythonプログラミングについて解説するVtuber サプーです✨
初心者でも分かりやすく、Pythonを体系的に学習できるような動画をアップロードしていきます!
みんなが少しでもPythonが好きになってくれたら嬉しいな💕
Twitterもやってるので、フォローお願いします!
Twitter ▶︎ / pythonsuppl
メール ▶︎ python.supu.vtuber@gmail.com
#Python
#並列処理
#マルチプロセス
#マルチスレッド
#初心者
#パイソン
#PythonVTuberサプー

Пікірлер: 53
@jimmyliao6429
@jimmyliao6429 Жыл бұрын
I usually learn Python by official documents. But this tutorial and VTuber are really nice, thanks. 😀
@pythonvtuber9917
@pythonvtuber9917 Жыл бұрын
thank you for watching☺️
@kurukuruteh
@kurukuruteh 2 жыл бұрын
並列処理、並行処理の違いをなんとなくでしか理解出来ていなかったので、最初の具体的な活用場面が凄い参考になりました🙏🙏🙏
@pythonvtuber9917
@pythonvtuber9917 2 жыл бұрын
ご視聴いただきありがとうございます😊 並列処理・並行処理 / マルチスレッド・マルチプロセス、と似ているのがあってややこしいのですが、この動画が理解のお役に立てていたら嬉しいです!!
@yakultloverjp
@yakultloverjp 2 жыл бұрын
ありがとうございます!
@pythonvtuber9917
@pythonvtuber9917 2 жыл бұрын
基本的な部分だけしか解説できていませんが、少しでも参考にしてもらえたら嬉しいです!
@iKami-jv9ml
@iKami-jv9ml 2 жыл бұрын
並行、並列を社内でレクチャーする際に私はよく料理に例えています。 並行は1つのキッチン(プロセス)を複数の料理人(プログラム)が取り合って作業するので、一見速そうに見えるけど料理人が増えると普通の処理より返って実行時間が遅くなりがちです。 並列は1人の料理人に1つのキッチンが与えられるので処理がとても早くなります。ですがその分お金(リソース)をたくさん使うので注意が必要です。
@pythonvtuber9917
@pythonvtuber9917 2 жыл бұрын
コメントありがとうございます😊 料理の例え!すごく面白いし分かりやすいです!!!今後、並列処理を説明するときはそのアイディアを参考にさせてもらいます😉
@me-me-661
@me-me-661 2 жыл бұрын
最初の並列処理と並行処理の使い分け方の説明、わかりやすかったです。threadingとかもっと上手く使いたいなと思うのですが、どういうタイミングで使えばよいか迷います。
@pythonvtuber9917
@pythonvtuber9917 2 жыл бұрын
正直、Pythonの弱点という動画でも解説しましたが、Pythonという言語自体は並列処理に強みがある言語ではないので、「積極的に使う」というより「必要になった時に使う」みたいなイメージだと思います! Pythonの弱点 ▶︎ kzfaq.info/get/bejne/fM6GidyI3c7ej3k.html
@raba-340
@raba-340 2 жыл бұрын
windowsのコマンドを複数同時に処理させたくて、最大数を見ながらsubprocessを実行させるのを自作しちゃいましたが、 やっぱり作らなくてもありますよね
@pythonvtuber9917
@pythonvtuber9917 2 жыл бұрын
自作で作れちゃうの凄いです!!機会があれば、ぜひ少ないコードでサクッと書ける concurrent futuresも使ってみてください😉
@Yamazae
@Yamazae 2 жыл бұрын
面白いですね
@pythonvtuber9917
@pythonvtuber9917 2 жыл бұрын
ありがとうございます😊
@michel_9830
@michel_9830 Жыл бұрын
わかりやすい解説ありがとうございます。 1つ質問なのですが、異なるスレッド・プロセス間で変数を共有することってできますか?
@pythonvtuber9917
@pythonvtuber9917 Жыл бұрын
プロセス間のメモリ共有はmultiprocessingのValueを使うとできた気がします。スレッド間はqueueを使えばできると思います!
@user-tz3nq5fj9c
@user-tz3nq5fj9c 2 жыл бұрын
いつも勉強になる動画ありがとうございます! 公式ドキュメントから自分が探しているライブラリーを見つけるのが苦手です。。。 1つずつ中身を見てくしかないのは分かってるんですが、 苦手過ぎて、Python3エンジニア認定基礎の模擬試験に少し逃げちゃいました😅
@pythonvtuber9917
@pythonvtuber9917 2 жыл бұрын
ご視聴いただきありがとうございます! 公式ドキュメント読むのは英語で分かりにくかったり、専門用語が羅列してあると辛いですよね😵 時には逃げても良いと思います!気分がのってる時に勉強した方が効率がいいですからね😉
@user-er8sy7xc8g
@user-er8sy7xc8g 2 жыл бұрын
プロセス間通信のもお願いします あと、asyncioのライブラリ
@pythonvtuber9917
@pythonvtuber9917 2 жыл бұрын
ご要望ありがとうございます!検討してみますね!
@koichirookutani2807
@koichirookutani2807 Жыл бұрын
並列処理のプログラム作成で大変助かっております。 次に行いたいことは,、あるFUNC_N()内の結果変数を別のFUNC_M()に受け渡す方法があればお教えいただけませんでしょうか。一旦MAIN()へRESULTとして引き渡し別のFUNCに引き渡そうとしてますがエラーが出てうまくいきません。
@pythonvtuber9917
@pythonvtuber9917 Жыл бұрын
ご質問ありがとうございます! mainに結果を渡して、別の関数に渡すところでエラーが出力されるとのことですが、エラー内容はどのようなものでしょうか?
@daichiishikawa2960
@daichiishikawa2960 7 ай бұрын
並行処理(concurrent processing) 待ち時間が長いような処理(Web API利用)について質問です Web API等が待ち時間が長い理由として APIにRequest してResponse を待つ時間があるからでしょうか??
@KU-oz1mk
@KU-oz1mk Жыл бұрын
func1の中にwhileの無限ループがある場合、with文を抜けないのですか?実際はfunc1やfunc2にはそれぞれ無限ループで繰り返すことが多いですよね。例えばfunc1にソケット通信のクライアントで1秒周期でサーバー接続など
@pythonvtuber9917
@pythonvtuber9917 Жыл бұрын
おっしゃる通りです!紹介している書き方だとwithは抜けないですね!
@lovePSP007
@lovePSP007 Жыл бұрын
マルチスレッドも複数のworkerが処理することはあるのですか? 1:57 の図のように、マルチスレッド(並行処理)は、単一のworkerが処理する仕組みだと理解したのですが、マルチスレッドの引数にmax worker数を指定してきたので、複数workerがそれぞれ並行処理をしているのか疑問が生じています PS いつも分かりやすい動画でよく見てます👀
@pythonvtuber9917
@pythonvtuber9917 Жыл бұрын
Pythonのマルチスレッドはおっしゃる通り並行処理で実態としては待ち時間を有効活用して外からみるとあたかも複数の処理を同時にやっているかのように見せています。このコード上で設定している「worker」は仮想的な作業者(外から見た時にあたかも複数の作業者がいるかのように見せている、その作業者)だと考えてもらえたらと思います。
@lovePSP007
@lovePSP007 Жыл бұрын
@@pythonvtuber9917 なるほど、ありがとうございます!
@ptptsoushu
@ptptsoushu 5 ай бұрын
とてもわかりやすかったです。かなり前の動画ですが、もし可能なら教えてください。pythonはインタプリタだからそもそも速度は速くないですが、pyinstallerなどでexe化したら高速化の効果が実感できるのでしょうか?
@pythonvtuber9917
@pythonvtuber9917 5 ай бұрын
exe化すると高速化するかどうかは、元のコードの処理内容に依存しますがpyinstallerの場合は起動に時間がかかるので高速化の効果はあまり実感できないと思います
@ptptsoushu
@ptptsoushu 5 ай бұрын
@@pythonvtuber9917 大晦日にお返事ありがとうございます。確かにpyinstallerで作ったアプリの立ち上がり遅いですね。 いつもわかりやすい動画ありがとうございます。23年8月からpythonの勉強始めたのですがすごく勉強になって助かります。これからもよろしくお願いします
@user-he8go1yu6i
@user-he8go1yu6i 2 жыл бұрын
もしかしてとは思いましたが CPUのコア数によって上限決まるんですね。 シングルコアだとそもそもワーカーは1ってことですね。 サプー先生はどこでこういう知識を身につけてるんです?学生時代?
@pythonvtuber9917
@pythonvtuber9917 2 жыл бұрын
コメントありがとうございます! 動画内でお話ししている知識や経験談は、全てお仕事をするようになってから身につけたものです!本やネットで知識をつけたり、仕事場の先輩から教えてもらったりして勉強しています😉
@user-pq7jd5dd5t
@user-pq7jd5dd5t 2 жыл бұрын
今回もためになる〜〜 内容と直接は関係ないんですけど、if __name__ == '__main__': の部分を最後に書くのはなんでですか? 順番的には最初(import文の後ろ)にi f __name__ == '__main__': の部分を書いても動き...ますよね?🤯
@pythonvtuber9917
@pythonvtuber9917 2 жыл бұрын
ご質問ありがとうございます! 以下のように書くとエラーになります😉 なので、一番下に書きます! ============= import os if __name__ == '__main__': main() def main(): print(os.path)
@luke0804
@luke0804 2 жыл бұрын
pythonはモダンな言語ですが、基本的には逐次処理(上から順番に処理が行われる)で進んでいきます。 defやclassなどで定義した時点では何も起こらないように見えますが、実は「関数やクラスを定義する」という処理が、その行を通る時に裏で行われています。 ここまで考えると、main()と呼び出しているifのブロックはdef mainの下に置いていないと、まずmainという未定義の関数を呼び出している、と怒られてしまいます。そして、この順番は他の関数でも同様なので、結局エラーを避けるためには、定義を全て終わらせて処理が始まるポイント(他の言語でもエントリポイントなどと呼ばれる部分ですね)をファイルの一番最後に書く必要がある、ということになります!
@akrs4102
@akrs4102 2 жыл бұрын
すごくわかりやすい説明ありがとうございます。 1点質問なのですが、ProcessPoolExecutorの方だと if __name__ == '__main__': 無しでmain関数を呼び出すとエラーとなるのですが、このif文が無いとエラーになるのって何故でしょうか
@pythonvtuber9917
@pythonvtuber9917 2 жыл бұрын
ご質問ありがとうございます😊 おそらくなんですが、このProcessPoolExecutorの元になっている公式のmultiprocessingのページに「新たな Python インタプリタによるメインモジュールのインポートが、意図しない副作用 (新たなプロセスを開始する等) を起こさずできるようにしてください。次のように if __name__ == '__main__': を使用してプログラムの "エントリポイント" を保護すべきです」って書いてあるので、言語仕様上の制約だと思います! 参考▶︎docs.python.org/ja/3/library/multiprocessing.html#the-spawn-and-forkserver-start-methods
@akrs4102
@akrs4102 2 жыл бұрын
@@pythonvtuber9917 なるほど、他からimportされた場合に意図しない挙動を防ぐ為なんですね、ありがとうございます!
@user-ki9pl2xg1c
@user-ki9pl2xg1c Жыл бұрын
動画ありがとうございます!分かりやすい動画でめちゃめちゃ助かってます! 質問があるのでお時間ありましたら返信お願いします。自分はプログラミングを始めて間もない者です。 numpyを使い画像処理をしてある数値Aを出すプログラムを作りました。 例えば0.png〜10000.pngの画像に対し、マルチプロセスを使いそれぞれの画像の数値Aのデータを取得したいです。 for arg1,arg2 in zip([0, 2500, 5000, 7500] , [2500, 5000, 7500, 10000]):と4プロセスでマルチプロセスをし、プロセス内でfor i in range(arg1, arg2):と繰り返し、img = cv2.imread('~~'+str(i)+'~~...として画像データを読み込み計算することで、数値Aを3倍以上高速に計算することができました。 それぞれのプロセスで生成した、2500個の数値Aをプロセスの外に出力したいのですが、マルチプロセスのため、上手くできません。 executer.submit周りで、出力した数値Aの配列を順番に出力すると、結局0〜9999と順番にプロセスを処理してしまいます。 また、result()に出力しても最後の[7500, 10000]のデータだけが出力されてしまいます。 また、画像1枚毎に、globals()['A%s' % i] = Aとしてみましたが、上手くいきません。 どうにかして、プロセス内から外に[0, 2500], ..., [7500, 10000]それぞれの数値A配列を出力したいです。 形はリストでもnumpyarrayでも、iとAの組み合わせでもなんでも良いです。 (計算終了後に10000個全部まとめてAの値でソートして、その後にマルチスレッドで画像ファイル操作します) ある程度は検索してみたのですが、これ以上どう検索したら良いかも分からないので質問しました。 検索ワードでも良いので教えて頂きたいです。 長文失礼しました。
@user-ki9pl2xg1c
@user-ki9pl2xg1c Жыл бұрын
質問しておいて申し訳ないですが、解決しました! プロセス内からcsvファイルに出力して、それらを読み込みました。
@pythonvtuber9917
@pythonvtuber9917 Жыл бұрын
自己解決できたようで何よりです!! 処理内容を全部理解できてないのですが、マルチプロセス間でのメモリ共有ができれば良いのかな??と思いました! ご参考 ▶︎ qiita.com/t_okkan/items/4127a87177ed2b2db148#%E5%85%B1%E6%9C%89%E3%83%A1%E3%83%A2%E3%83%AAshared-memory
@user-ki9pl2xg1c
@user-ki9pl2xg1c Жыл бұрын
@@pythonvtuber9917 返信ありがとうございます! 参考にします!! めちゃめちゃ助かります!!
@world-satellite-2525
@world-satellite-2525 2 жыл бұрын
PythonってGILの排他ロックがあるので、CPUバウンドな処理の場合、1スレッドでしか実行できず、処理の並列化は制限されますか?
@pythonvtuber9917
@pythonvtuber9917 2 жыл бұрын
動画内の3:16あたりで説明している通り、Pythonの場合はマルチスレッドを実行しようと思っても、(排他ロックのため)並列じゃなくて並行処理になりますね😉
@gmaiI.com.
@gmaiI.com. 2 жыл бұрын
マルチスレッドでmax_workersはどれくらいまで増やしていいのでしょうか
@pythonvtuber9917
@pythonvtuber9917 2 жыл бұрын
ご質問ありがとうございます! 最適なmax_workersの数は、PCのリソースや並行処理させたいその処理内容に依存するので一概にいくつまで増やしてOKですよ、とは言えないんですよね😵 ちなみにデフォルト値はマルチスレッドの場合CPUのコア数+4(←が32より大きかったら32)です。なので、一般的にはそのくらいなのかな、と思いました。
@yashiTaka0603
@yashiTaka0603 2 жыл бұрын
異常終了時は、後で指定して実行するようなことは できるんでしょうか?
@pythonvtuber9917
@pythonvtuber9917 2 жыл бұрын
ご質問ありがとうございます😊 質問の答えになっているかわかりませんが、異常終了はresult()で結果を取り出すときに発生するので、その行を通常の例外処理と同じようにtry-exceptで捉えて、その後の処理を実行することができると思います!
@KumamusiPudding
@KumamusiPudding 2 жыл бұрын
可愛い女の子にPythonを教わるとかいうあり得ない状況に脳が混乱する
@pythonvtuber9917
@pythonvtuber9917 2 жыл бұрын
😂 女性のプログラマーは少ないですから珍しいかもですね!
@debilman11
@debilman11 2 жыл бұрын
二人とも寝るのがお仕事
@pythonvtuber9917
@pythonvtuber9917 2 жыл бұрын
すやー😴
[Introduction to Python Class]  Carefully explain the basics of Python classes !! [For beginners]
24:33
Pythonプログラミング VTuber サプー
Рет қаралды 112 М.
small vs big hoop #tiktok
00:12
Анастасия Тарасова
Рет қаралды 17 МЛН
Универ. 13 лет спустя - ВСЕ СЕРИИ ПОДРЯД
9:07:11
Комедии 2023
Рет қаралды 6 МЛН
Climbing to 18M Subscribers 🎉
00:32
Matt Larose
Рет қаралды 35 МЛН
小女孩把路人当成离世的妈妈,太感人了.#short #angel #clown
00:53
【Pythonプログラミング】scikit-learnで機械学習!〜 入門編・初心者向け 〜
28:39
Pythonプログラミング VTuber サプー
Рет қаралды 58 М.
[Python programming for beginners]  ~VTuber programming learning channnel~
25:40
Pythonプログラミング VTuber サプー
Рет қаралды 74 М.
【初心者向け】クソコードを書かないためのテクニック5選
14:39
エンジニアチャンネル
Рет қаралды 98 М.
小学生でもわかるWebAPI入門。ゼロからWebAPIを作ってみよう
1:09:20
だれでもエンジニア / 山浦清透
Рет қаралды 236 М.
【Pythonプログラミング入門】クラスの継承を解説!〜VTuberと学習〜 【初心者向け】
10:53
【Pythonで画像加工】OpenCVの基本を解説!〜 プログラミング初心者 向け 〜
16:41
Pythonプログラミング VTuber サプー
Рет қаралды 45 М.
Iphone or nokia
0:15
rishton vines😇
Рет қаралды 1,8 МЛН
сюрприз
1:00
Capex0
Рет қаралды 1,6 МЛН
Собери ПК и Получи 10,000₽
1:00
build monsters
Рет қаралды 999 М.
Will the battery emit smoke if it rotates rapidly?
0:11
Meaningful Cartoons 183
Рет қаралды 30 МЛН
ПОКУПКА ТЕЛЕФОНА С АВИТО?🤭
1:00
Корнеич
Рет қаралды 3,1 МЛН
Урна с айфонами!
0:30
По ту сторону Гугла
Рет қаралды 7 МЛН