$30 off During Our Annual Pro Sale. View Details »

Event-driven programming

massa142
October 13, 2021

Event-driven programming

みんなのPython勉強会 #74 の発表資料。

イベント駆動型プログラミングの3つのパターン Callback・Subject・Topic について紹介します。

massa142

October 13, 2021
Tweet

More Decks by massa142

Other Decks in Programming

Transcript

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

    View Slide

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

    View Slide

  3. 宣伝!
    3

    View Slide

  4. 4

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  12. 1. Callback
    12

    View Slide

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

    イベントループがイベントの監視と、コールバック関数への振り分けをしている
    13

    View Slide

  14. イメージ図
    14

    View Slide

  15. JavaScriptでの例
    setTimeout(() => {

    alert('#stapy')

    }, 1000);

    15

    View Slide

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

    View Slide

  17. 2. Subject
    17

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  21. 3. Topic
    21

    View Slide

  22. Topic
    イベントの定義からはじまる
    イベントを発生させる存在がなくても、そのイベントを購読可能
    だれも購読してないイベントを発生可能
    イベントが、発生する側・購読する側に依存してない

    このイベントのことは、トピックと
    呼ばれたりシグナルと呼ばれたりします(ややかしいで
    すね!

    Django, Flask, Scrapyなどはシグナルという用語を使ってる
    22

    View Slide

  23. 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

    View Slide

  24. 特徴
    発生する側・購読する側が疎結合なので、イベントの種類を細かく分割して設計しやす

    疎結合すぎる面もあるので、知らないうちにイベントを購読していて処理が実行されて
    いるということも起こりがち
    個人的には、メインロジックではなく補助的な処理を書くのがおすすめ
    24

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  29. おわりに
    29

    View Slide

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

    30

    View Slide

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

    View Slide

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

    View Slide