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
EventLoopの実装から考えるFiberの位置付けについて/Fiber and Async...
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
Ryo Tomidokoro
December 22, 2021
Technology
1.4k
4
Share
EventLoopの実装から考えるFiberの位置付けについて/Fiber and Async Request
非同期処理によるAPIリクエストのサンプル実装を通して、Fiberが求められてきた背景を説明します。最終的に、それがEventLoopにつながっていきます。
Ryo Tomidokoro
December 22, 2021
More Decks by Ryo Tomidokoro
See All by Ryo Tomidokoro
あるアーキテクチャ決定と その結果/architecture-decision-and-its-result
hanhan1978
2
870
開発者が知っておきたい複雑さの正体/where-the-complexity-comes-from
hanhan1978
8
3.6k
Spec Driven Development入門/spec_driven_development_for_learners
hanhan1978
2
1.9k
フロントエンドがTypeScriptなら、バックエンドはPHPでもいいじゃない/php-is-not-bad
hanhan1978
8
14k
どうすると生き残れないのか/how-not-to-survive
hanhan1978
17
15k
100分で本番デプロイ!Laravelで作るWebアプリケーション作成/100min_web_app_cicd
hanhan1978
1
270
PHPerのための計算量入門/Complexity101 for PHPer
hanhan1978
8
3.7k
集中して作業する技術/how_to_work_deeply
hanhan1978
65
57k
PHPでデータベースを作ってみた/create-data-with-php
hanhan1978
11
11k
Other Decks in Technology
See All in Technology
AWSアップデートから考える継続的な運用改善
toru_kubota
2
360
A Harness for Behaviour: how to get AI to generate code that does what we intend, or "TDD in the age of AI"
xpmatteo
0
280
責任あるソフトウェアエンジニアリングの紹介4章・5章 / RSE_Ch4-5
ido_kara_deru
0
290
実践 TanStack Start ― 新規プロダクトを開発して確立した、サーバーとクライアント境界の設計パターン / Practical TanStack Start Server-Client Boundary Patterns
kaminashi
2
240
その英語学習、AWSで代替できませんか?
suzutatsu
1
210
TypeScriptとAngular Signal で実現する保守性の高いアプリケーション設計 - 3層アーキテクチャによる責務分離の実践(たつかわ) https://2026.tskaigi.org/talks/10
nealle
1
280
基礎から解説!Icebergで紐解くSnowflake×Databricks連携の現在地
cm_yasuhara
0
210
TypeScript の型で副作用の実行順序を制御する
yanaemon
2
180
CARTA HOLDINGS エンジニア向け 採用ピッチ資料 / CARTA-GUIDE-for-Engineers
carta_engineering
0
47k
TypeScriptはどのようにどこまで推論できるのか ─ とにかく as は禁止で
ypresto
2
370
はじめてのAI-DLC
yoshidashingo
2
440
AI時代に求められる思考のパラダイムシフト
nrinetcom
PRO
1
130
Featured
See All Featured
Mind Mapping
helmedeiros
PRO
1
200
Reality Check: Gamification 10 Years Later
codingconduct
0
2.2k
How GitHub (no longer) Works
holman
316
150k
The World Runs on Bad Software
bkeepers
PRO
72
12k
Public Speaking Without Barfing On Your Shoes - THAT 2023
reverentgeek
1
400
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
210
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.7k
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
210
Skip the Path - Find Your Career Trail
mkilby
1
120
Are puppies a ranking factor?
jonoalderson
1
3.4k
Principles of Awesome APIs and How to Build Them.
keavy
128
17k
Raft: Consensus for Rubyists
vanstee
141
7.4k
Transcript
EventLoop の実装から考えるFiber PHPerKaigi petit - PHP8.1 リリース祝賀会 2021-12-21 @hanhan1978
自己紹介
こんなのを PHP カンファレンス2021 でやった。 https://speakerdeck.com/hanhan1978/php-async-programming
ペチコンの内容を3行でまとめると... 非同期処理はわからん Fiber よくわからん とりあえず、PHP でPHP を動かせ 全体的に、分かってるやつしか分からん構成になってしまって反省し ている。
8.1 リリース祝賀会バージョンでは... Fiber 完全に理解している 非同期処理を完全に理解している わかりやすく説明できる自信がある
Fiber を理解する必要はあるか? よくある解説 これがイヤな場合 -> Fiber を理解しないといかん。 これでOK な場合 ->
Fiber を実行基盤にもつフレームワークが登場した時に詰む -> つまり、Fiber を理解しないといかん。 なんとなく非同期処理ができるっぽいやつ。ライブラリ作成者の 為の機能、一般開発者は気にしなくて良い。 “ “
まじめな話 PHP ファンデーションとかもできたし、実装の詳細から逃げ回ってい るだけでは駄目。 みんなで知見をため、公表しあって、日本からもコミッターが出るよ うに盛り上げていかないとイカン。 今日一番まじめな話、終わり。
今日のゴール Fiber をみんなが完全に理解すること
物語の開始地点 なぜ、Fiber が求められているのか? なぜ、それがPHP に入ってくるのか? この物語のWHY が解決しないと、以降の議論は全て薄くなる。 非同期処理が2021 年現在、非同期処理から遠い位置にいるPHP にまで
言語機能として入ってこようとしているのはなぜ?
半導体の話 ムーアの法則が、頭打ちしつつある。電気的に、熱的に、集積度を上 げにくくなってる。 -> コアの性能アップは難しい -> だから、マルチコアで並行処理をすることで、スループットを上げ よう。 ここが開始地点。 パタヘネを読もう。
並行処理の話 これまでは、我々が気にする必要がなかった。 -> アプリケーションレイヤーの話ではなく、ハードウェアやOS の役 目 我々は同期処理パラダイスで生きていけた。
もったいない HTTP リクエストの応答待ち、DB クエリの応答待ち。この間、CPU は 遊んでる。 厳密には、遊んでるわけではないが、PHP のスクリプトは同期的処理 を行うため、きっちり応答をまつ。 結果として、CPU
はその性能を全て引き出されていない状態になる。
もったいない
もったいなくない
もったいないサンプル dummy API ( リクエストにきっちり1 秒かかる)
古き良きPHP スクリプト (API を5 回叩く)
同期的HTTP リクエストの結果
なぜ、5 秒かかるのか? 1 + 1 + 1 + 1 +
1 = 5 だから。 PHP の組み込み関数はブロッキング。つまり、処理をブロックする HTTP Request -> 応答待ちで1 秒待つ 解消するためには、応答を待たずに次のLoop に入らないといけない。 HTTP Request -> 応答を待たずにLoop -> 結果が帰ってきたら出力
じゃあどうすればいい? file_get_contents は処理をブロックする... curl でも一緒... どうすれば、処理をブロックしないのか?誰がブロックするのか?
ブロックしていたのは誰? Socket ブロッキング、ノンブロッキングのモードを持つ。つまり、ノンブロ ッキングモードのSocket を使う file_get_contents を作ればいい。
ブロックしない file_get_contents
PHP によるブロックしないAPI コール
PHP によるブロックしないAPI コール結果 ブロックしない、非同期プログミングが完了。
NonBlocking 化による実行スレッドの流れ 夢は達成された。Generator も Fiber もいらなかったんや...
本当か? それを確かめるために、調査隊はさきほどのソースコードを Generator を使って書き直してみた。
非同期関数のGenerator 版
PHP によるブロックしないAPI コール(Generator 版)
通信結果を受け取る関数(Generator 版) ※まじで酷いコードだが、検証用なので許して。
Generator 版の実行結果 きっちり1 秒で5 リクエスト
Generator にしたことで何が起きた? 結果を受け取る処理が、g->current() に置き換わった。 Generator で停止したスレッドの再開 という形で抽象化された。
Generator 前のコード Socket から結果を受け取るという具象コードを書いている。 Generator を使うと 停止・再開 という文脈を活かした抽象化が出来 る。
Generator 化による実行スレッドの流れ 夢は達成された。 Fiber はいらなかったんや...
本当か? それを確かめるために、調査隊はさきほどのソースコードをFiber を使 って書き直してみた。
PHP によるブロックしないAPI コール(Fiber 版)
通信結果を受け取る関数(Fiber 版) ※Generator を返す必要が無くなった
通信結果を受け取る関数2(Fiber 版)
Fiber 版の実行結果 きっちり1 秒で5 リクエスト
Fiber にしたことで何が起きた? 停止スレッドは Fiber オブジェクトに抽象化 Fiber オブジェクトの処理内部では、どこからでも自分を停止でき る。 Generator と違って、
yield して主スレッドに戻す必要がない。
Fiber 化による実行スレッドの流れ ここまでのまとめ
個人的にポイントになると思うところ 非同期プログミングにおいては、主スレッドと分岐スレッドという考 え方を常に持つ必要がある。 今回の例だと、HTTP リクエストを投げているのは分岐スレッド 分岐スレッドがレスポンスが受け取ったことを検査して、分岐スレッ ドの停止・再開を行うのは主スレッド 非同期プログミングは、分岐スレッドを管理する主スレッドが必要
EventLoop とは? Swoole, ReactPHP, AmPHP などは、それぞれ EventLoop を実装し ている。 なぜ、彼らは
EventLoop を実装する? EventLoop とは?? 並行処理をするのに、何故 EventLoop が必要なのか?
EventLoop 語弊を恐れずにいうと、ただのLoop さっきのサンプルのFiber 版では、Fiber オブジェクトを生成してLoop で回して処理をしていた。 これも広義のEventLoop といえる(はず)
EventLoop の構成要素 EventProvider 処理を Queue に追加 EventLoop スケジューラーに従って Event を
処理 EventHandler Event を実行する
EventLoop の構成要素 EventLoop はシングルスレッドでいい リクエストは Queue で一直線にされる (DeMultiplex) Reactor Pattern
という
EventLoop と Fiber の関係 Fiber により、停止・再開が抽象化されると、処理が抽象的に、簡潔 にかけるようになる。 これが、Fiber の本当の意味。
Fiber の中身 ucontext というライブラリが使われている。このシステムコールは、 ユーザーコンテキストの作成・切替をサポートする。boost_context というやつもある。 Swoole は、boost_context を使って、Fiber っぽいことをやってい
る。
この先の展開 Fiber で実装された EventLoop を持つフレームワークが出てくる。 (間違いない) Fiber が拡張され、スケジューラーやPromise, Async/Await が
PHP に 提供される (8.3? 9.0?)
hanhan1978 の予定 Fiber で EventLoop を実装し、分かりやすいサンプルを書く。 EventLoop の構成要素を、分かりやすいサンプルで書く。 分かりやすい図で、下の概念を説明する。 スケジューラー
non-preemptive 非同期、並行、このあたりはOS 周りの実装で出てくる。 OS 実装の本とかに参考になる記述が散見される。
PHPerkaigi にプロポーザル投げるの で、みんな星つけてね!