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
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
massa142
October 13, 2021
Programming
1.6k
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Event-driven programming
みんなのPython勉強会 #74 の発表資料。
イベント駆動型プログラミングの3つのパターン Callback・Subject・Topic について紹介します。
massa142
October 13, 2021
More Decks by massa142
See All by massa142
Event-driven architecture
massa142
4
4.8k
Django & Celery in production
massa142
3
6.3k
Other Decks in Programming
See All in Programming
使用 Meilisearch 建立新聞搜尋工具
johnroyer
0
100
地域 SRE コミュニティ最前線 - ホンマでっかSRE勉強会
tk3fftk
0
150
Go1.27で導入されるジェネリクスメソッドでできること
mackee
0
250
はてなアカウント基盤 State of the Union
cockscomb
1
1.3k
PHPだって関数型したい 〜できること、できないこと〜 / fp-in-php
jsoizo
0
160
Signal Forms: Details & Live Coding @enterJS 2026 in Mannheim
manfredsteyer
PRO
0
220
Creating Composable Callables in Contemporary C++
rollbear
0
190
ADKを使って簡単にAIエージェントを作ってみよう
k1mu21
0
290
AIを活用したE2Eテスト実装効率化のあゆみ / ebisu-mobile-14-kotetu
kotetuco
0
160
Strategic Design in the Frontend: Moduliths & Micro Frontends @DDDEurope
manfredsteyer
PRO
0
140
「AIで開発し、AIを届ける」をEvalでつなぐ 〜AIネイティブに始めるプロダクト開発の実践〜 / Connecting "Develop with AI, deliver AI" with Eval
rkaga
4
5.7k
エンジニア向け会社紹介/Findy Company Profile
findyinc
6
360k
Featured
See All Featured
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
23k
The Organizational Zoo: Understanding Human Behavior Agility Through Metaphoric Constructive Conversations (based on the works of Arthur Shelley, Ph.D)
kimpetersen
PRO
0
380
jQuery: Nuts, Bolts and Bling
dougneiner
66
8.5k
The Illustrated Children's Guide to Kubernetes
chrisshort
51
52k
Building an army of robots
kneath
306
46k
Reflections from 52 weeks, 52 projects
jeffersonlam
356
21k
Typedesign – Prime Four
hannesfritz
42
3.1k
A Modern Web Designer's Workflow
chriscoyier
698
190k
A Soul's Torment
seathinner
6
3k
Everyday Curiosity
cassininazir
0
250
Testing 201, or: Great Expectations
jmmastey
46
8.2k
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
2
330
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