Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Event-driven programming
Search
massa142
October 13, 2021
Programming
1
1.2k
Event-driven programming
みんなのPython勉強会 #74 の発表資料。
イベント駆動型プログラミングの3つのパターン Callback・Subject・Topic について紹介します。
massa142
October 13, 2021
Tweet
Share
More Decks by massa142
See All by massa142
Event-driven architecture
massa142
4
4.1k
Django & Celery in production
massa142
3
5.5k
Other Decks in Programming
See All in Programming
Linux && Docker 研修/Linux && Docker training
forrep
23
4.1k
Package Traits
ikesyo
2
230
最近のVS Codeで気になるニュース 2025/01
74th
1
240
ペアーズでの、Langfuseを中心とした評価ドリブンなリリースサイクルのご紹介
fukubaka0825
1
200
2025.01.17_Sansan × DMM.swift
riofujimon
2
670
DevFest - Serverless 101 with Google Cloud Functions
tunmise
0
140
Immutable ActiveRecord
megane42
0
120
AWS Lambda functions with C# 用の Dev Container Template を作ってみた件
mappie_kochi
0
220
個人アプリを2年ぶりにアプデしたから褒めて / I just updated my personal app, praise me!
lovee
0
310
さいきょうのレイヤードアーキテクチャについて考えてみた
yahiru
1
550
Kubernetes History Inspector(KHI)を触ってみた
bells17
0
110
Vue.jsでiOSアプリを作る方法
hal_spidernight
0
120
Featured
See All Featured
What's in a price? How to price your products and services
michaelherold
244
12k
Writing Fast Ruby
sferik
628
61k
VelocityConf: Rendering Performance Case Studies
addyosmani
327
24k
Large-scale JavaScript Application Architecture
addyosmani
510
110k
GraphQLとの向き合い方2022年版
quramy
44
13k
Product Roadmaps are Hard
iamctodd
PRO
50
11k
Gamification - CAS2011
davidbonilla
80
5.1k
StorybookのUI Testing Handbookを読んだ
zakiyama
28
5.4k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
28
2.2k
Stop Working from a Prison Cell
hatefulcrawdad
267
20k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
33
2k
Documentation Writing (for coders)
carmenintech
67
4.6k
Transcript
イベント駆動型プログラミングについて みんなのPython勉強会 #74 2021/10/13 | Masataka Arai
お前誰よ? Masataka Arai @massa142 SQUEEZE Inc. Pythonもくもく会 主催 Python Boot
Camp 講師 2
宣伝! 3
4
@iktakahiro とポッドキャスト最近はじめました 次回は @iktakahiro が、PyCon JP 2021で登壇した直後に収録! 熱い登壇後記を話す予定です connpassでもイベント立てるので、みんな参加してねー 2021.10.14
『コードと文学』第6夜 - Show note 5
今日はイベント駆動型プログラミングについて、ざっと話そうと思います。 6
目次 イベント駆動型プログラミングとは イベント駆動型プログラミングの3パターン Callback Subject Topic イベント駆動型アーキテクチャへ 7
イベント駆動型プログラミングとは 8
上から下に順に処理が実行される(手続き型プログラミング)のではなく、 特定のイベントが発生したら処理を実行してねっていう手法 9
GUIだとユーザーの操作・入力はすべてイベントなので、フロントエンドでは必ず必要 になってくる フロントエンドだけでじゃなくて、DBのトリガもイベント駆動型の一種 トリガ: あるテーブルにINSERTやUPDATE、DELETE文を実行したタイミングで、 ストアドプロシージャを呼び出す機能 というわけで、バックエンドでもよく使うやり方だよ 10
イベント駆動型プログラミングの3パターン 11
1. Callback 12
Callback イベントに対する処理 (コールバック関数) を実装して、あらかじめ登録しておく そのイベントが発生したら、コールバック関数が呼び出される ※ イベントループがイベントの監視と、コールバック関数への振り分けをしている 13
イメージ図 14
JavaScriptでの例 setTimeout(() => { alert('#stapy') }, 1000); 15
特徴 シンプルでわかりやすい! 1つのイベントに紐付けられるコールバック関数は1つだけ 16
2. Subject 17
Subject Subjectが発生させるイベントを、複数のObserverが購読する 18
イメージ図 Ref: Observer Pattern in Java. “Life was always a
matter of waiting… | by Arjun Sunil Kumar 19
特徴 Callbackと違って、複数のイベントハンドラを登録できる Subjectが発生させるすべてのイベントがObserverに通知される Observerが欲しいイベントをフィルタリングする or イベントの種類ごとにSubjectを分ける 大規模になると、複雑にはなる Callbackよりも疎結合で、次に紹介するTopicよりも密結合 個人的には、ロジックを把握しやすいのでメインとなるロジックに適用するのがお すすめ
20
3. Topic 21
Topic イベントの定義からはじまる イベントを発生させる存在がなくても、そのイベントを購読可能 だれも購読してないイベントを発生可能 イベントが、発生する側・購読する側に依存してない ※ このイベントのことは、トピックと 呼ばれたりシグナルと呼ばれたりします(ややかしいで すね! ※
Django, Flask, Scrapyなどはシグナルという用語を使ってる 22
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
特徴 発生する側・購読する側が疎結合なので、イベントの種類を細かく分割して設計しやす い 疎結合すぎる面もあるので、知らないうちにイベントを購読していて処理が実行されて いるということも起こりがち 個人的には、メインロジックではなく補助的な処理を書くのがおすすめ 24
イベント駆動型アーキテクチャへ 25
イベント駆動型プログラミングは、アプリケーションの部品を分解して、部品間のやり 取りをイベントでやっている この分解のスコープを広げて、やり取りをネットワーク越しにするようになったのがイ ベント駆動アーキテクチャ 26
メリット 時間がかかる処理などを非同期に逃がせる HTTPリクエストをより多く処理できるように 処理を分散できるので、スケールがしやすい エラーが発生してもリトライできるので、復元力の高いシステムに デメリット アーキテクチャが複雑になる 監視・ログなどの考えごとが増える 処理の遅延が大きくなりうる 27
イベント駆動アーキテクチャ・非同期タスクについては、DjangoCongress JP 2021で話した ので、詳しくはこちらをどうぞ! Django & Celery in production -
Speaker Deck 28
おわりに 29
イベント駆動型プログラミングには3つのパターンがあるよ Callback・Subject・Topic それぞれメリット・デメリットがあるから、用法用量を守って使っていきましょう イベント駆動型プログラミングの発展として、イベント駆動アーキテクチャも見てみよ う 30
参考文献 エキスパートPythonプログラミング 改訂3版 第16章「イベント駆動型プログラミング」 31
ご静聴ありがとうございました 32