Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Python_Parrotと学ぶPythonの並行実行.pdf
Search
rf-castle
August 22, 2021
120
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Python_Parrotと学ぶPythonの並行実行.pdf
rf-castle
August 22, 2021
More Decks by rf-castle
See All by rf-castle
Rustで競技プログラミング
rfcastle
0
60
Alter_Linuxのすすめ
rfcastle
0
170
PythonParrotと学ぶPythonの並列実行
rfcastle
0
72
Nuxt jsに触れてみた
rfcastle
0
35
Featured
See All Featured
Heart Work Chapter 1 - Part 1
lfama
PRO
10
36k
Technical Leadership for Architectural Decision Making
baasie
3
580
How to audit for AI Accessibility on your Front & Back End
davetheseo
0
550
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
330
Jess Joyce - The Pitfalls of Following Frameworks
techseoconnect
PRO
1
420
Exploring anti-patterns in Rails
aemeredith
4
510
Sam Torres - BigQuery for SEOs
techseoconnect
PRO
0
550
Rails Girls Zürich Keynote
gr2m
96
14k
[RailsConf 2023] Rails as a piece of cake
palkan
59
7k
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
1
410
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
2
700
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
540
Transcript
Python Parrotと学ぶ Pythonの並列実行 田城幸太
今回の内容 Pythonで使える並列実行ライブラリを紹介 threading(スレッドベースの並列実行) multiprocessing(プロセスベースの並列実行)
並列実行って? その名の通り、複数のコードを同時実行すること。 逐次処理により、1つずつ処理が実行されるが、 それでは1度に1つの処理しか行えない。 コアも1つしか使えない! 使用場面
マルチコアCPUのリソースを有効に使う。(multiprocessing) I/Oバウンドの間に別な処理を実行する。(threading)
使い方 threading.Threadか、multiprocessing.Processクラスを使う。 コンストラクタ引数(すべてキーワード付き引数) group:常にNoneにする。将来 ThreadGroup クラスが実装されたときの拡張用に予約され ている。
target: やらせたい処理をcallableオブジェクト(関数など)で渡す args,kwargs:↑に渡したい引数を指定する。 args:キーワードなし引数のタプル kwargs:キーワード付き引数の辞書型 daemon:デーモンスレッドであるかを指定する。 デーモンスレッド以外のスレッドがすべて終了すると、Pythonプログラム全体が終了する。 Noneにすると、現在のスレッドとおなじになる。
使い方2 メソッド start() スレッド・プロセスの活動を開始するメソッド。 join()
スレッド・プロセスが終わるまで待機するメソッド。 自分自身のスレッド・プロセスに対してこのメソッドを呼ぶとデッドロックを起こすため エラーになる。 (もしこれが許されれば永遠に待つことになる) まだ開始していない場合も同様。
None
None
None
None
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 は常に解除される。(別スレッドに処理を移せ る)
同期プリミティブ Lock ロックとアンロック状態があり、デフォルトはアンロック。 一般に、同時アクセスのできないリソースを利用する場合に使う acquire()
アンロック状態ならロック状態にして即座に処理を戻す(ロックの獲得) ロック状態なら、アンロック状態になるまで待つ。 release() ロックをアンロックする。 acquire関数でロックを獲得しようとしているスレッドがあれば、 どれか1つがロックを獲得できる。
同期プリミティブ Semaphore 内部カウンタがあり、インスタンス作成時に初期値を決める 主に、同時に使える数に制限のあるリソースに対して使用する acquire
内部カウンタが0よりも大きければ、内部カウンタを1つ下げてすぐに処理を返す 内部カウンタが0ならreleaseによって内部カウンタが1以上になるまで待つ release(n=1) セマフォを解放して、内部カウンタをn増加させる。
同期プリミティブ Event 真と偽のフラグがあり、デフォルトは偽 主に、事前処理があってその処理を待ってからでないと処理できないスレッドに対 して使う set()
フラグを真にして、waitメソッドでブロックされているすべてのスレッドを起こす。 wait() フラグが真なら直ちに処理が戻る フラグが偽なら真になるまで(setが呼ばれるまで)待ってから戻る clear(): フラグを偽に戻す is_set(): フラグの確認
同期プリミティブ(with文) with文を使うことで、withスイート内で例外が起きた場合でも、 ロックを解放してくれる。 これによりロックの解放忘れを防げる!
おわりに Pythonに限らず、並列実行は難しい。 Pythonで並列実行とかってあまり使わないイメージ? asyncioは比較的使うかも。 Pythonで並列実行やるときの皆様の参考になれば良いです。