みんなのPython勉強会 #74 の発表資料。
イベント駆動型プログラミングの3つのパターン Callback・Subject・Topic について紹介します。
イベント駆動型プログラミングについてみんなのPython勉強会 #742021/10/13 | Masataka Arai
View Slide
お前誰よ?Masataka Arai @massa142SQUEEZE Inc.Pythonもくもく会 主催Python Boot Camp 講師2
宣伝!3
4
@iktakahiro とポッドキャスト最近はじめました次回は @iktakahiro が、PyCon JP 2021で登壇した直後に収録!熱い登壇後記を話す予定ですconnpassでもイベント立てるので、みんな参加してねー2021.10.14 『コードと文学』第6夜 - Show note5
今日はイベント駆動型プログラミングについて、ざっと話そうと思います。6
目次イベント駆動型プログラミングとはイベント駆動型プログラミングの3パターンCallbackSubjectTopicイベント駆動型アーキテクチャへ7
イベント駆動型プログラミングとは8
上から下に順に処理が実行される(手続き型プログラミング)のではなく、特定のイベントが発生したら処理を実行してねっていう手法9
GUIだとユーザーの操作・入力はすべてイベントなので、フロントエンドでは必ず必要になってくるフロントエンドだけでじゃなくて、DBのトリガもイベント駆動型の一種トリガ: あるテーブルにINSERTやUPDATE、DELETE文を実行したタイミングで、ストアドプロシージャを呼び出す機能というわけで、バックエンドでもよく使うやり方だよ10
イベント駆動型プログラミングの3パターン11
1. Callback12
Callbackイベントに対する処理 (コールバック関数) を実装して、あらかじめ登録しておくそのイベントが発生したら、コールバック関数が呼び出される※イベントループがイベントの監視と、コールバック関数への振り分けをしている13
イメージ図14
JavaScriptでの例setTimeout(() => {alert('#stapy')}, 1000);15
特徴シンプルでわかりやすい!1つのイベントに紐付けられるコールバック関数は1つだけ16
2. Subject17
SubjectSubjectが発生させるイベントを、複数のObserverが購読する18
イメージ図Ref: Observer Pattern in Java. “Life was always a matter of waiting… | by Arjun Sunil Kumar19
特徴Callbackと違って、複数のイベントハンドラを登録できるSubjectが発生させるすべてのイベントがObserverに通知されるObserverが欲しいイベントをフィルタリングする orイベントの種類ごとにSubjectを分ける大規模になると、複雑にはなるCallbackよりも疎結合で、次に紹介するTopicよりも密結合個人的には、ロジックを把握しやすいのでメインとなるロジックに適用するのがおすすめ20
3. Topic21
Topicイベントの定義からはじまるイベントを発生させる存在がなくても、そのイベントを購読可能だれも購読してないイベントを発生可能イベントが、発生する側・購読する側に依存してない※このイベントのことは、トピックと呼ばれたりシグナルと呼ばれたりします(ややかしいですね!※Django, Flask, Scrapyなどはシグナルという用語を使ってる22
Djangoでの例from django.db.models.signals import post_savefrom django.dispatch import receiverfrom django.core.mail import send_mailfrom .models import User@receiver(post_save, sender=User)def send_registered_mail_handler(sender, instance, created, **kwargs):if created:send_mail('タイトル', '本文', '[email protected]', [instance.email])23
特徴発生する側・購読する側が疎結合なので、イベントの種類を細かく分割して設計しやすい疎結合すぎる面もあるので、知らないうちにイベントを購読していて処理が実行されているということも起こりがち個人的には、メインロジックではなく補助的な処理を書くのがおすすめ24
イベント駆動型アーキテクチャへ25
イベント駆動型プログラミングは、アプリケーションの部品を分解して、部品間のやり取りをイベントでやっているこの分解のスコープを広げて、やり取りをネットワーク越しにするようになったのがイベント駆動アーキテクチャ26
メリット時間がかかる処理などを非同期に逃がせるHTTPリクエストをより多く処理できるように処理を分散できるので、スケールがしやすいエラーが発生してもリトライできるので、復元力の高いシステムにデメリットアーキテクチャが複雑になる監視・ログなどの考えごとが増える処理の遅延が大きくなりうる27
イベント駆動アーキテクチャ・非同期タスクについては、DjangoCongress JP 2021で話したので、詳しくはこちらをどうぞ!Django & Celery in production - Speaker Deck28
おわりに29
イベント駆動型プログラミングには3つのパターンがあるよCallback・Subject・Topicそれぞれメリット・デメリットがあるから、用法用量を守って使っていきましょうイベント駆動型プログラミングの発展として、イベント駆動アーキテクチャも見てみよう30
参考文献エキスパートPythonプログラミング 改訂3版第16章「イベント駆動型プログラミング」31
ご静聴ありがとうございました32