Slide 1

Slide 1 text

Python Parrotと学ぶ Pythonの並行実行 田城幸太

Slide 2

Slide 2 text

自己紹介  会津大学 学部三年  田城幸太  Zliの部長、通りすがりのPython Parrot  嫁:羽黒(艦これ)  妹:チノ(ごちうさ)  相棒:キィラン(ゼノンザード)  Twitter: @kouta_tashiro

Slide 3

Slide 3 text

今回の内容  Pythonで使える並列実行ライブラリを紹介  threading(スレッドベースの並列実行)  multiprocessing(プロセスベースの並列実行)

Slide 4

Slide 4 text

並列実行って?  その名の通り、複数のコードを同時実行すること。  逐次処理により、1つずつ処理が実行されるが、 それでは1度に1つの処理しか行えない。  コアも1つしか使えない!  使用場面  マルチコアCPUのリソースを有効に使う。(multiprocessing)  I/Oバウンドの間に別な処理を実行する。(threading)

Slide 5

Slide 5 text

No content

Slide 6

Slide 6 text

No content

Slide 7

Slide 7 text

No content

Slide 8

Slide 8 text

No content

Slide 9

Slide 9 text

使い方  threading.Threadか、multiprocessing.Processクラスを使う。  コンストラクタ引数(すべてキーワード付き引数)  group:常にNoneにする。将来 ThreadGroup クラスが実装されたときの拡張用に予約され ている。  target: やらせたい処理をcallableオブジェクト(関数など)で渡す  args,kwargs:↑に渡したい引数を指定する。  args:キーワードなし引数のタプル  kwargs:キーワード付き引数の辞書型  daemon:デーモンスレッドであるかを指定する。  デーモンスレッド以外のスレッドがすべて終了すると、Pythonプログラム全体が終了する。  Noneにすると、現在のスレッドとおなじになる。

Slide 10

Slide 10 text

使い方2  メソッド  start()  スレッド・プロセスの活動を開始するメソッド。  join()  スレッド・プロセスが終わるまで待機するメソッド。  自分自身のスレッド・プロセスに対してこのメソッドを呼ぶとデッドロックを起こすため エラーになる。 (もしこれが許されれば永遠に待つことになる)  まだ開始していない場合も同様。

Slide 11

Slide 11 text

CPUバウンドの場合  逐次実行  4.848s  threading  5.039s  multiprocessing  1.521s

Slide 12

Slide 12 text

IOバウンドの場合  逐次実行  1.454s  threading  0.558s  multiprocessing  0.574s

Slide 13

Slide 13 text

スレッドとプロセス

Slide 14

Slide 14 text

GIL(グローバルインタプリタロック)  複数スレッドがあっても、1度に1つのスレッドしかバイトコードを実行でき ない仕組み。  オブジェクトモデルが同時アクセスに対して暗黙的に安全になる。  おおざっぱに言うなら、threadingモジュールだと1つのコアしか使えない  ただし、標準あるいは外部のいくつかの拡張モジュールは、圧縮やハッシュ計 算などの計算の重い処理をするときに GIL を解除するように設計されている。  Zlibや、hashlibなどがこれに該当。  また、I/O 処理をする場合 GIL は常に解除される。(別スレッドに処理を移せ る)

Slide 15

Slide 15 text

おわりに  Pythonに限らず、並列実行は難しい。  Pythonで並列実行とかってあまり使わないイメージ?  asyncioは比較的使うかも。  Pythonで並列実行やるときの皆様の参考になれば良いです。