Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
PythonParrotと学ぶPythonの並列実行
Search
rf-castle
July 10, 2021
0
44
PythonParrotと学ぶPythonの並列実行
rf-castle
July 10, 2021
Tweet
Share
More Decks by rf-castle
See All by rf-castle
Rustで競技プログラミング
rfcastle
0
38
Alter_Linuxのすすめ
rfcastle
0
66
Python_Parrotと学ぶPythonの並行実行.pdf
rfcastle
0
64
Nuxt jsに触れてみた
rfcastle
0
16
Featured
See All Featured
Rails Girls Zürich Keynote
gr2m
91
13k
Optimizing for Happiness
mojombo
370
69k
Six Lessons from altMBA
skipperchong
22
3k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
660
120k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
123
39k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
21
1.4k
GraphQLの誤解/rethinking-graphql
sonatard
55
9.3k
For a Future-Friendly Web
brad_frost
172
9k
Building Better People: How to give real-time feedback that sticks.
wjessup
356
18k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
226
51k
The World Runs on Bad Software
bkeepers
PRO
61
6.7k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
188
16k
Transcript
Python Parrotと学ぶ Pythonの並行実行 田城幸太
自己紹介 会津大学 学部三年 田城幸太 Zliの部長、通りすがりのPython Parrot
嫁:羽黒(艦これ) 妹:チノ(ごちうさ) 相棒:キィラン(ゼノンザード) Twitter: @kouta_tashiro
今回の内容 Pythonで使える並列実行ライブラリを紹介 threading(スレッドベースの並列実行) multiprocessing(プロセスベースの並列実行)
並列実行って? その名の通り、複数のコードを同時実行すること。 逐次処理により、1つずつ処理が実行されるが、 それでは1度に1つの処理しか行えない。 コアも1つしか使えない! 使用場面
マルチコアCPUのリソースを有効に使う。(multiprocessing) I/Oバウンドの間に別な処理を実行する。(threading)
None
None
None
None
使い方 threading.Threadか、multiprocessing.Processクラスを使う。 コンストラクタ引数(すべてキーワード付き引数) group:常にNoneにする。将来 ThreadGroup クラスが実装されたときの拡張用に予約され ている。
target: やらせたい処理をcallableオブジェクト(関数など)で渡す args,kwargs:↑に渡したい引数を指定する。 args:キーワードなし引数のタプル kwargs:キーワード付き引数の辞書型 daemon:デーモンスレッドであるかを指定する。 デーモンスレッド以外のスレッドがすべて終了すると、Pythonプログラム全体が終了する。 Noneにすると、現在のスレッドとおなじになる。
使い方2 メソッド start() スレッド・プロセスの活動を開始するメソッド。 join()
スレッド・プロセスが終わるまで待機するメソッド。 自分自身のスレッド・プロセスに対してこのメソッドを呼ぶとデッドロックを起こすため エラーになる。 (もしこれが許されれば永遠に待つことになる) まだ開始していない場合も同様。
CPUバウンドの場合 逐次実行 4.848s threading 5.039s
multiprocessing 1.521s
IOバウンドの場合 逐次実行 1.454s threading 0.558s
multiprocessing 0.574s
スレッドとプロセス
GIL(グローバルインタプリタロック) 複数スレッドがあっても、1度に1つのスレッドしかバイトコードを実行でき ない仕組み。 オブジェクトモデルが同時アクセスに対して暗黙的に安全になる。 おおざっぱに言うなら、threadingモジュールだと1つのコアしか使えない ただし、標準あるいは外部のいくつかの拡張モジュールは、圧縮やハッシュ計
算などの計算の重い処理をするときに GIL を解除するように設計されている。 Zlibや、hashlibなどがこれに該当。 また、I/O 処理をする場合 GIL は常に解除される。(別スレッドに処理を移せ る)
おわりに Pythonに限らず、並列実行は難しい。 Pythonで並列実行とかってあまり使わないイメージ? asyncioは比較的使うかも。 Pythonで並列実行やるときの皆様の参考になれば良いです。