threading の同期制御の概念的なメモ
17.1. threading — スレッドベースの並列処理 — Python 3.5.2 ドキュメント
Lock
まあロックはロックやろ。データの所有権みたいなもの
厳密にはデータの所有権ではなくて、諸々のデータを用いた行動の実行権か。諸々のデータを「一人占め」して安全に行動を実行できるための。
とはいえ、Lockの権利は他の人にぶん取られることがあるから、気が済むまで悠々と行動できるわけではないよね
RLock
こっちは他の人にいきなり権利をぶん取られることはない。
再帰ロックという名の通り、所有中は何回もロックかけれる。なんのためにするんだろ?おかゆに誰か教えて。
Semaphore
これは wikipedia にもあったけど、「図書室のたとえ」が分かりやすかった
ある図書室に学習用の個室が10部屋あり、それぞれの学習室は一度に1人の学生が使用するとする。争奪戦が始まらないよう、学生はフロントデスクで学習室の使用を申し込むことになっている。学習室を使用し終えたら、学生はフロントに立ち寄ってその学習室が空いたことを知らせなければならない。全ての学習室が埋まっている場合、学生はフロントで部屋が空くのを待つ。
フロントの図書係はどの学習室が空いているかは把握しておらず、単に空いている部屋数のみを知っている。学生が申し込んできたとき、図書係はその数から1を引く。学生が学習室の利用を終えたとき、図書係はその数に1を加える。学習室の使用許可が与えられたとき、その部屋は必要なだけ使い続けることができ、したがって事前に学習室を予約することはできない。
Condition
「条件変数」っていうらしい。
自分にとってイイ感じになるまでロック手放して、イイ感じになったらまたロック取得して作業するときに使う
一方で、「共有リソース更新したぞ」ってのを他のスレッドにnotify
できる。この機能のおかげで「いい感じになったら動く」というのができる。
ロックとちがって自発的に待つことができる wait
。待って、誰かが notify してくれたらいそいそと動く、みたいなことができる。
Barrier
協力プレイ系ゲームの「複数人で押さないと動かない岩とか扉」みたいなやつ
.wait
して、指定人数が wait したらブロックが外れる。まさにダンジョンの仕掛け
Event
「よ~い、ドン」
誰かが「いいよ」っていうまで待機するためのもの。
ちょっとConditionと似てるよね。