Slide 1

Slide 1 text

イベント駆動型プログラミングについて みんなのPython勉強会 #74 2021/10/13 | Masataka Arai

Slide 2

Slide 2 text

お前誰よ? Masataka Arai @massa142 SQUEEZE Inc. Pythonもくもく会 主催 Python Boot Camp 講師 2

Slide 3

Slide 3 text

宣伝! 3

Slide 4

Slide 4 text

4

Slide 5

Slide 5 text

@iktakahiro とポッドキャスト最近はじめました 次回は @iktakahiro が、PyCon JP 2021で登壇した直後に収録! 熱い登壇後記を話す予定です connpassでもイベント立てるので、みんな参加してねー 2021.10.14 『コードと文学』第6夜 - Show note 5

Slide 6

Slide 6 text

今日はイベント駆動型プログラミングについて、ざっと話そうと思います。 6

Slide 7

Slide 7 text

目次 イベント駆動型プログラミングとは イベント駆動型プログラミングの3パターン Callback Subject Topic イベント駆動型アーキテクチャへ 7

Slide 8

Slide 8 text

イベント駆動型プログラミングとは 8

Slide 9

Slide 9 text

上から下に順に処理が実行される(手続き型プログラミング)のではなく、 特定のイベントが発生したら処理を実行してねっていう手法 9

Slide 10

Slide 10 text

GUIだとユーザーの操作・入力はすべてイベントなので、フロントエンドでは必ず必要 になってくる フロントエンドだけでじゃなくて、DBのトリガもイベント駆動型の一種 トリガ: あるテーブルにINSERTやUPDATE、DELETE文を実行したタイミングで、 ストアドプロシージャを呼び出す機能 というわけで、バックエンドでもよく使うやり方だよ 10

Slide 11

Slide 11 text

イベント駆動型プログラミングの3パターン 11

Slide 12

Slide 12 text

1. Callback 12

Slide 13

Slide 13 text

Callback イベントに対する処理 (コールバック関数) を実装して、あらかじめ登録しておく そのイベントが発生したら、コールバック関数が呼び出される ※ イベントループがイベントの監視と、コールバック関数への振り分けをしている 13

Slide 14

Slide 14 text

イメージ図 14

Slide 15

Slide 15 text

JavaScriptでの例 setTimeout(() => { alert('#stapy') }, 1000); 15

Slide 16

Slide 16 text

特徴 シンプルでわかりやすい! 1つのイベントに紐付けられるコールバック関数は1つだけ 16

Slide 17

Slide 17 text

2. Subject 17

Slide 18

Slide 18 text

Subject Subjectが発生させるイベントを、複数のObserverが購読する 18

Slide 19

Slide 19 text

イメージ図 Ref: Observer Pattern in Java. “Life was always a matter of waiting… | by Arjun Sunil Kumar 19

Slide 20

Slide 20 text

特徴 Callbackと違って、複数のイベントハンドラを登録できる Subjectが発生させるすべてのイベントがObserverに通知される Observerが欲しいイベントをフィルタリングする or イベントの種類ごとにSubjectを分ける 大規模になると、複雑にはなる Callbackよりも疎結合で、次に紹介するTopicよりも密結合 個人的には、ロジックを把握しやすいのでメインとなるロジックに適用するのがお すすめ 20

Slide 21

Slide 21 text

3. Topic 21

Slide 22

Slide 22 text

Topic イベントの定義からはじまる イベントを発生させる存在がなくても、そのイベントを購読可能 だれも購読してないイベントを発生可能 イベントが、発生する側・購読する側に依存してない ※ このイベントのことは、トピックと 呼ばれたりシグナルと呼ばれたりします(ややかしいで すね! ※ Django, Flask, Scrapyなどはシグナルという用語を使ってる 22

Slide 23

Slide 23 text

Djangoでの例 from django.db.models.signals import post_save from django.dispatch import receiver from django.core.mail import send_mail from .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

Slide 24

Slide 24 text

特徴 発生する側・購読する側が疎結合なので、イベントの種類を細かく分割して設計しやす い 疎結合すぎる面もあるので、知らないうちにイベントを購読していて処理が実行されて いるということも起こりがち 個人的には、メインロジックではなく補助的な処理を書くのがおすすめ 24

Slide 25

Slide 25 text

イベント駆動型アーキテクチャへ 25

Slide 26

Slide 26 text

イベント駆動型プログラミングは、アプリケーションの部品を分解して、部品間のやり 取りをイベントでやっている この分解のスコープを広げて、やり取りをネットワーク越しにするようになったのがイ ベント駆動アーキテクチャ 26

Slide 27

Slide 27 text

メリット 時間がかかる処理などを非同期に逃がせる HTTPリクエストをより多く処理できるように 処理を分散できるので、スケールがしやすい エラーが発生してもリトライできるので、復元力の高いシステムに デメリット アーキテクチャが複雑になる 監視・ログなどの考えごとが増える 処理の遅延が大きくなりうる 27

Slide 28

Slide 28 text

イベント駆動アーキテクチャ・非同期タスクについては、DjangoCongress JP 2021で話した ので、詳しくはこちらをどうぞ! Django & Celery in production - Speaker Deck 28

Slide 29

Slide 29 text

おわりに 29

Slide 30

Slide 30 text

イベント駆動型プログラミングには3つのパターンがあるよ Callback・Subject・Topic それぞれメリット・デメリットがあるから、用法用量を守って使っていきましょう イベント駆動型プログラミングの発展として、イベント駆動アーキテクチャも見てみよ う 30

Slide 31

Slide 31 text

参考文献 エキスパートPythonプログラミング 改訂3版 第16章「イベント駆動型プログラミング」 31

Slide 32

Slide 32 text

ご静聴ありがとうございました 32