Part29:GenEvent

近況報告2015/9/19

ことり「海未ちゃん」
海未「」
ことり「ことり[お祭り編]の覚醒後の絵、見せて?」
海未「」
ことり「じゃあ浴衣の絵でもいいよ?」
海未「」
ことり「3枚ってお願いしたよね?どうして1枚もないのかな?」
海未「・・・業務、多忙につき」
ことり「海未ちゃんの業務って何?」
海未「」

希(ことりちゃんの無垢な笑顔が心に刺さるわ・・・)
凛「こ、ことりちゃん、あの、海未ちゃんそろそろ・・・」
ことり「えっとね、凛ちゃんには聞いてないの」
凛「はうぅ」
希「凛ちゃんが、あっさり轟沈」
凛「希上等兵、凛のことはもういいから、海未ちゃんを助けるにゃ・・・」
希「凛二等兵、その犠牲は無駄にはせんで・・・!」

海未「・・・申し訳、ありません」
ことり「海未ちゃんはことりの前に、まず山内先生とアルパカさんに頭下げるべきなんじゃないかな?」
海未「」
希(メールメール・・・えっと、こうさかほのか、っと)
ことり「まさかかさねちゃん2枚で満足しちゃったの?ううん、そんなはずないよね」
海未「」
希(めーでー、めーでー、今すぐ適当な理由を付けてことりちゃんを呼び出すんや。海未ちゃんの胃と精神が危ない。おーばー)
ことり「海未ちゃんがことりのことを大切に思ってくれてるなら、ラブカストーンと睡眠時間くらい・・・あ、電話」
海未「」
ことり「もしもし・・・穂乃果ちゃん?・・・え、今からご飯?2人で?・・・うん、いいよ~」
希(ナイスや穂乃果ちゃん!)
ことり「じゃあことりは、ほ・の・か・ちゃ・ん・と、ご飯食べに行くから、またね~」
希(しまった、これはこれであかん)
海未「・・・ことりが・・・穂乃果と・・・2人で・・・ううっ」
希「海未ちゃん、気をしっかり持つんや!衛生兵!衛生兵!」
凛「衛生兵なら穂乃果ちゃんとご飯食べに行ったにゃ・・・」
希「うう、端から見てるだけで十二指腸に来るわ・・・なんやこの痴話喧嘩」


本編ここから

海未「ことりによる笑顔の激詰めから一夜明け、どうにか傷の癒えたlily whiteの面々は再び集結しElixirの勉強に勤しむのでした・・・」
希「思い出したらあかん、忘れるんや、海未ちゃん」
凛「え、えーと、凛がGenEventの話するにゃ!」

凛「GenEventは、イベント処理のためのモジュールにゃ。イベントマネージャとイベントハンドラがあって、イベントマネージャにイベントハンドラを登録しておくと、イベントが発生したときにイベントハンドラが実行されるんだよ」

凛「Forwarderがイベントハンドラにゃ。メッセージを親プロセスに転送するだけの簡単なやつだよ」
海未「似たようなコードを以前見ましたね」
凛「GenEvent.start_linkでイベントマネージャを作って、GenEvent.add_handlerでイベントハンドラとしてForwarderを追加してるにゃ。あとは、GenEvent.sync_notifyでイベントを発生させられるよ」
希「notifyしたやつがForwarderのhandle_eventで送り返されてきてるわけやね」
凛「うん。だからsync_notifyで投げたメッセージがreceiveで受け取れるにゃ」

凛「GenServerのcastとcallみたいに、GenEventにもnotifyとsync_notifyがあって、nofityは非同期、sync_notifyは同期になるにゃ」
海未「使い分けに、ちょっと迷ってしまいますね」
凛「一般的にはsync_notifyの方がおすすめみたいだよ」

凛「前回までで作ってきたスコアマッチメッセージサーバにGenEventを組み込んでみるよ」

凛「bucketの作成と削除のときにメッセージを送るようにしてみるにゃ。まずKV.Registryの実装をこうして・・・」

凛「クライアントコードをこうすると・・・」

凛「こうにゃ!」

海未「確かに、作成と削除のタイミングでメッセージを受信していますね」
凛「まずKV.Registryが、stateの1つとしてイベントマネージャを持ち歩くようにしたんだ」
希「ああそれで、namesとrefsのタプルだったのをマップに変えたんやね」
凛「あとはhandle_castとhandle_infoで、bucket作るときと削除するときにsync_notifyしてるだけ。簡単にゃ!」

凛「最後にイベントストリームというのをやってみるよ。iex使った方が分かりやすいにゃ」

凛「イベントハンドラの代わりにね、イベントを待ち続けてるプロセスを用意してるにゃ」
海未「3行目の内包表記のところですね」
凛「でね、2行目でGenEvent.streamが返すstreamが、Enumerableを実装してるから内包表記に使えるんだけど、これはイベントマネージャで発生したイベントを列挙するんだ」
希「何かイベントがあると、ループが1回回る感じ?」
凛「そんな感じだと思うにゃ。とにかく、このプロセスが動き出すと、あとはnotifyする度にこの内包表記の処理が実行されるんだよ」
海未「・・・確かに、iexでnofityを打つ度に実行されているようです」
希「イベントハンドラを定義しておかなくてもいいのはお手軽やね」

希「次回・・・supervisorとかかな」
海未「また複雑になってきましたが・・・」


LINEで送る
Pocket


返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です