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.3k
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.5k
Django & Celery in production
massa142
3
6.1k
Other Decks in Programming
See All in Programming
コード生成なしでモック処理を実現!ovechkin-dm/mockioで学ぶメタプログラミング
qualiarts
0
260
マンガアプリViewerの大画面対応を考える
kk__777
0
150
デミカツ切り抜きで面倒くさいことはPythonにやらせよう
aokswork3
0
260
AI 駆動開発におけるコミュニティと AWS CDK の価値
konokenj
5
220
CSC509 Lecture 06
javiergs
PRO
0
270
なぜGoのジェネリクスはこの形なのか? - Featherweight Goが明かす設計の核心
qualiarts
0
240
組込みだけじゃない!TinyGo で始める無料クラウド開発入門
otakakot
2
360
Google Opalで使える37のライブラリ
mickey_kubo
3
140
React Nativeならぬ"Vue Native"が実現するかも?_新世代マルチプラットフォーム開発フレームワークのLynxとLynxのVue.js対応を追ってみよう_Vue Lynx
yut0naga1_fa
2
510
はじめてのDSPy - 言語モデルを『プロンプト』ではなく『プログラミング』するための仕組み
masahiro_nishimi
4
14k
Software Architecture
hschwentner
6
2.3k
バッチ処理を「状態の記録」から「事実の記録」へ
panda728
PRO
0
190
Featured
See All Featured
Rails Girls Zürich Keynote
gr2m
95
14k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
2.5k
A better future with KSS
kneath
239
18k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
Visualization
eitanlees
149
16k
Context Engineering - Making Every Token Count
addyosmani
8
300
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.2k
Code Review Best Practice
trishagee
72
19k
A Tale of Four Properties
chriscoyier
161
23k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
1.7k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
359
30k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.2k
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