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

Поделиться
HTML-код
  • Опубликовано: 29 ноя 2024

Комментарии • 55

  • @iKami-jv9ml
    @iKami-jv9ml 2 года назад +8

    並行、並列を社内でレクチャーする際に私はよく料理に例えています。
    並行は1つのキッチン(プロセス)を複数の料理人(プログラム)が取り合って作業するので、一見速そうに見えるけど料理人が増えると普通の処理より返って実行時間が遅くなりがちです。
    並列は1人の料理人に1つのキッチンが与えられるので処理がとても早くなります。ですがその分お金(リソース)をたくさん使うので注意が必要です。

    • @pythonvtuber9917
      @pythonvtuber9917  2 года назад +1

      コメントありがとうございます😊
      料理の例え!すごく面白いし分かりやすいです!!!今後、並列処理を説明するときはそのアイディアを参考にさせてもらいます😉

  • @kurukuruteh
    @kurukuruteh 2 года назад +4

    並列処理、並行処理の違いをなんとなくでしか理解出来ていなかったので、最初の具体的な活用場面が凄い参考になりました🙏🙏🙏

    • @pythonvtuber9917
      @pythonvtuber9917  2 года назад +1

      ご視聴いただきありがとうございます😊
      並列処理・並行処理 / マルチスレッド・マルチプロセス、と似ているのがあってややこしいのですが、この動画が理解のお役に立てていたら嬉しいです!!

  • @raba-340
    @raba-340 2 года назад +1

    windowsのコマンドを複数同時に処理させたくて、最大数を見ながらsubprocessを実行させるのを自作しちゃいましたが、
    やっぱり作らなくてもありますよね

    • @pythonvtuber9917
      @pythonvtuber9917  2 года назад

      自作で作れちゃうの凄いです!!機会があれば、ぜひ少ないコードでサクッと書ける concurrent futuresも使ってみてください😉

  • @jimmyliaouwu
    @jimmyliaouwu 2 года назад +3

    I usually learn Python by official documents.
    But this tutorial and VTuber are really nice, thanks. 😀

  • @me-me-661
    @me-me-661 2 года назад

    最初の並列処理と並行処理の使い分け方の説明、わかりやすかったです。threadingとかもっと上手く使いたいなと思うのですが、どういうタイミングで使えばよいか迷います。

    • @pythonvtuber9917
      @pythonvtuber9917  2 года назад +2

      正直、Pythonの弱点という動画でも解説しましたが、Pythonという言語自体は並列処理に強みがある言語ではないので、「積極的に使う」というより「必要になった時に使う」みたいなイメージだと思います!
      Pythonの弱点 ▶︎ ruclips.net/video/FhVVyWxhz_E/видео.html

  • @koichirookutani2807
    @koichirookutani2807 2 года назад +1

    並列処理のプログラム作成で大変助かっております。
    次に行いたいことは,、あるFUNC_N()内の結果変数を別のFUNC_M()に受け渡す方法があればお教えいただけませんでしょうか。一旦MAIN()へRESULTとして引き渡し別のFUNCに引き渡そうとしてますがエラーが出てうまくいきません。

    • @pythonvtuber9917
      @pythonvtuber9917  2 года назад

      ご質問ありがとうございます!
      mainに結果を渡して、別の関数に渡すところでエラーが出力されるとのことですが、エラー内容はどのようなものでしょうか?

  • @こいつあいつ
    @こいつあいつ 2 года назад +1

    プロセス間通信のもお願いします
    あと、asyncioのライブラリ

    • @pythonvtuber9917
      @pythonvtuber9917  2 года назад

      ご要望ありがとうございます!検討してみますね!

  • @michel_9830
    @michel_9830 Год назад

    わかりやすい解説ありがとうございます。
    1つ質問なのですが、異なるスレッド・プロセス間で変数を共有することってできますか?

    • @pythonvtuber9917
      @pythonvtuber9917  Год назад

      プロセス間のメモリ共有はmultiprocessingのValueを使うとできた気がします。スレッド間はqueueを使えばできると思います!

  • @daichiishikawa2960
    @daichiishikawa2960 Год назад

    並行処理(concurrent processing)
    待ち時間が長いような処理(Web API利用)について質問です
    Web API等が待ち時間が長い理由として
    APIにRequest してResponse を待つ時間があるからでしょうか??

  • @ptptsoushu
    @ptptsoushu 11 месяцев назад

    とてもわかりやすかったです。かなり前の動画ですが、もし可能なら教えてください。pythonはインタプリタだからそもそも速度は速くないですが、pyinstallerなどでexe化したら高速化の効果が実感できるのでしょうか?

    • @pythonvtuber9917
      @pythonvtuber9917  11 месяцев назад +1

      exe化すると高速化するかどうかは、元のコードの処理内容に依存しますがpyinstallerの場合は起動に時間がかかるので高速化の効果はあまり実感できないと思います

    • @ptptsoushu
      @ptptsoushu 11 месяцев назад

      @@pythonvtuber9917 大晦日にお返事ありがとうございます。確かにpyinstallerで作ったアプリの立ち上がり遅いですね。 いつもわかりやすい動画ありがとうございます。23年8月からpythonの勉強始めたのですがすごく勉強になって助かります。これからもよろしくお願いします

  • @こりんてつ
    @こりんてつ 2 года назад

    いつも勉強になる動画ありがとうございます!
    公式ドキュメントから自分が探しているライブラリーを見つけるのが苦手です。。。
    1つずつ中身を見てくしかないのは分かってるんですが、
    苦手過ぎて、Python3エンジニア認定基礎の模擬試験に少し逃げちゃいました😅

    • @pythonvtuber9917
      @pythonvtuber9917  2 года назад

      ご視聴いただきありがとうございます!
      公式ドキュメント読むのは英語で分かりにくかったり、専門用語が羅列してあると辛いですよね😵
      時には逃げても良いと思います!気分がのってる時に勉強した方が効率がいいですからね😉

  • @淀川謙次
    @淀川謙次 7 дней назад

    4:40あたりのtheadingの綴りは、たぶんthreadingじゃないかな。 あと、import time をつけないと、time.sleep(2) が動かないみたいです。

    • @pythonvtuber9917
      @pythonvtuber9917  7 дней назад

      スライドにrが抜けてましたね!!ご指摘ありがとうございます!
      スライドは縦幅がどにも足りなくてimport文を一部省略させてもらってます...実際に動かすコードには書いてますね!

  • @KU-oz1mk
    @KU-oz1mk 2 года назад

    func1の中にwhileの無限ループがある場合、with文を抜けないのですか?実際はfunc1やfunc2にはそれぞれ無限ループで繰り返すことが多いですよね。例えばfunc1にソケット通信のクライアントで1秒周期でサーバー接続など

    • @pythonvtuber9917
      @pythonvtuber9917  2 года назад

      おっしゃる通りです!紹介している書き方だとwithは抜けないですね!

  • @てるてるぼうず-t8n
    @てるてるぼうず-t8n 2 года назад +1

    もしかしてとは思いましたが
    CPUのコア数によって上限決まるんですね。
    シングルコアだとそもそもワーカーは1ってことですね。
    サプー先生はどこでこういう知識を身につけてるんです?学生時代?

    • @pythonvtuber9917
      @pythonvtuber9917  2 года назад +2

      コメントありがとうございます!
      動画内でお話ししている知識や経験談は、全てお仕事をするようになってから身につけたものです!本やネットで知識をつけたり、仕事場の先輩から教えてもらったりして勉強しています😉

  • @yakultloverjp
    @yakultloverjp 2 года назад

    ありがとうございます!

    • @pythonvtuber9917
      @pythonvtuber9917  2 года назад

      基本的な部分だけしか解説できていませんが、少しでも参考にしてもらえたら嬉しいです!

  • @こいか-w8c
    @こいか-w8c 2 года назад

    動画ありがとうございます!分かりやすい動画でめちゃめちゃ助かってます!
    質問があるのでお時間ありましたら返信お願いします。自分はプログラミングを始めて間もない者です。
    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の値でソートして、その後にマルチスレッドで画像ファイル操作します)
    ある程度は検索してみたのですが、これ以上どう検索したら良いかも分からないので質問しました。
    検索ワードでも良いので教えて頂きたいです。
    長文失礼しました。

    • @こいか-w8c
      @こいか-w8c 2 года назад

      質問しておいて申し訳ないですが、解決しました!
      プロセス内からcsvファイルに出力して、それらを読み込みました。

    • @pythonvtuber9917
      @pythonvtuber9917  2 года назад

      自己解決できたようで何よりです!!
      処理内容を全部理解できてないのですが、マルチプロセス間でのメモリ共有ができれば良いのかな??と思いました!
      ご参考 ▶︎ qiita.com/t_okkan/items/4127a87177ed2b2db148#%E5%85%B1%E6%9C%89%E3%83%A1%E3%83%A2%E3%83%AAshared-memory

    • @こいか-w8c
      @こいか-w8c 2 года назад

      @@pythonvtuber9917 返信ありがとうございます!
      参考にします!!
      めちゃめちゃ助かります!!

  • @lovePSP007
    @lovePSP007 2 года назад

    マルチスレッドも複数のworkerが処理することはあるのですか?
    1:57 の図のように、マルチスレッド(並行処理)は、単一のworkerが処理する仕組みだと理解したのですが、マルチスレッドの引数にmax worker数を指定してきたので、複数workerがそれぞれ並行処理をしているのか疑問が生じています
    PS
    いつも分かりやすい動画でよく見てます👀

    • @pythonvtuber9917
      @pythonvtuber9917  2 года назад

      Pythonのマルチスレッドはおっしゃる通り並行処理で実態としては待ち時間を有効活用して外からみるとあたかも複数の処理を同時にやっているかのように見せています。このコード上で設定している「worker」は仮想的な作業者(外から見た時にあたかも複数の作業者がいるかのように見せている、その作業者)だと考えてもらえたらと思います。

    • @lovePSP007
      @lovePSP007 2 года назад

      @@pythonvtuber9917
      なるほど、ありがとうございます!

  • @ebi-0343
    @ebi-0343 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 года назад +1

      pythonはモダンな言語ですが、基本的には逐次処理(上から順番に処理が行われる)で進んでいきます。
      defやclassなどで定義した時点では何も起こらないように見えますが、実は「関数やクラスを定義する」という処理が、その行を通る時に裏で行われています。
      ここまで考えると、main()と呼び出しているifのブロックはdef mainの下に置いていないと、まずmainという未定義の関数を呼び出している、と怒られてしまいます。そして、この順番は他の関数でも同様なので、結局エラーを避けるためには、定義を全て終わらせて処理が始まるポイント(他の言語でもエントリポイントなどと呼ばれる部分ですね)をファイルの一番最後に書く必要がある、ということになります!

  • @world-satellite-2525
    @world-satellite-2525 2 года назад

    PythonってGILの排他ロックがあるので、CPUバウンドな処理の場合、1スレッドでしか実行できず、処理の並列化は制限されますか?

    • @pythonvtuber9917
      @pythonvtuber9917  2 года назад +1

      動画内の3:16あたりで説明している通り、Pythonの場合はマルチスレッドを実行しようと思っても、(排他ロックのため)並列じゃなくて並行処理になりますね😉

  • @akrs4102
    @akrs4102 2 года назад

    すごくわかりやすい説明ありがとうございます。
    1点質問なのですが、ProcessPoolExecutorの方だと if __name__ == '__main__': 無しでmain関数を呼び出すとエラーとなるのですが、このif文が無いとエラーになるのって何故でしょうか

    • @pythonvtuber9917
      @pythonvtuber9917  2 года назад +1

      ご質問ありがとうございます😊
      おそらくなんですが、この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された場合に意図しない挙動を防ぐ為なんですね、ありがとうございます!

  • @Yamazae
    @Yamazae 2 года назад

    面白いですね

  • @yashiTaka0603
    @yashiTaka0603 2 года назад

    異常終了時は、後で指定して実行するようなことは
    できるんでしょうか?

    • @pythonvtuber9917
      @pythonvtuber9917  2 года назад

      ご質問ありがとうございます😊
      質問の答えになっているかわかりませんが、異常終了はresult()で結果を取り出すときに発生するので、その行を通常の例外処理と同じようにtry-exceptで捉えて、その後の処理を実行することができると思います!

  • @debilman11
    @debilman11 2 года назад

    二人とも寝るのがお仕事

  • @KumamusiPudding
    @KumamusiPudding 2 года назад

    可愛い女の子にPythonを教わるとかいうあり得ない状況に脳が混乱する

    • @pythonvtuber9917
      @pythonvtuber9917  2 года назад

      😂 女性のプログラマーは少ないですから珍しいかもですね!