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
F#でちょっとずつ返す
Search
tsumiki
November 08, 2025
Programming
15
0
Share
F#でちょっとずつ返す
F#で非同期ストリームを扱う際の内部的な動き
tsumiki
November 08, 2025
More Decks by tsumiki
See All by tsumiki
おもしろい組織図の世界
tsumiki
0
25
リーダブルコードLT
tsumiki
0
18
メディアリニューアルした話
tsumiki
0
14
Svelte触ってみた
tsumiki
0
14
スピーダ事業 Product Teamの1週間を考察してみた。
tsumiki
0
17
New Joinerの時に感じていたことを振り返る
tsumiki
0
11
F# AsyncとTask
tsumiki
0
16
評価が大事
tsumiki
0
15
Other Decks in Programming
See All in Programming
プロパティの順序で型推論が壊れる!? TypeScript6.0の修正からContext-Sensitivityの仕組みを追う
bicstone
2
1.3k
New "Type" system on PicoRuby
pocke
1
380
Inside Stream API
skrb
1
410
Oxlintはいかにしてtsgolintのlint ruleを呼び出しているのか
syumai
2
1k
Claspは野良GASの夢をみるか
takter00
0
140
OSもどきOS
arkw
0
330
AI時代のUIはどこへ行く?その2!
yusukebe
7
3.2k
jQueryをバージョンアップする前に使いたいjQuery Migrate
matsuo_atsushi
0
130
Skillは並べた。動かなかった。契約で繋いだ。— 65個のSkillから、自走する開発サイクルへ
junholee
0
790
サーバーレスで作る、動画データ管理基盤
oyasumipants
0
320
TypeSpec で繋ぐ複数プロダクトの型安全
maroon8021
1
270
ECR拡張スキャンでSBOMを収集して サプライチェーン攻撃の影響調査を 爆速で終わらせてみた
akihisaikeda
2
210
Featured
See All Featured
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
The Curious Case for Waylosing
cassininazir
1
360
30 Presentation Tips
portentint
PRO
1
310
Unsuck your backbone
ammeep
672
58k
A designer walks into a library…
pauljervisheath
211
24k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
231
23k
Building AI with AI
inesmontani
PRO
1
1k
The Art of Programming - Codeland 2020
erikaheidi
57
14k
[RailsConf 2023] Rails as a piece of cake
palkan
59
6.6k
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
300
A Soul's Torment
seathinner
6
2.9k
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
380
Transcript
F# でちょっとずつ返す
ちょっとずつ返す?
ちょっとずつ返す? DAG API (F# Minimal API) LLM (Gemini) Request
Request Streaming Response Streaming Response
ちょっとずつ返す? DAG API (F# Minimal API) LLM (Gemini) SCAI
API
選択肢 1. Server-Sent Events ( SSE ) 2. IAsyncEnumerable<T> の活用
a. 非同期ストリームを表現するための .NET の標準的なインターフェース
Server-Sent Events • サーバーからクライアントへ一方向にデータを逐次PushするW3C標準の通信方式 MDN: https://developer.mozilla.org/ja/docs/Web/API/Server-sent_events
IAsyncEnumerable<T> • 非同期ストリームを表現するための .NET の標準的なインターフェース • Chunked transfer encoding (HTTP/1.1で導入されたデータ転送方式)を使用
◦ チャンク形式のHTTPリクエスト ◦ レスポンスヘッダー:Transfer-Encoding: chanked .NET: https://learn.microsoft.com/ja-jp/dotnet/api/system.collections.generic.iasyncenumerable-1?view=net-9.0
DAG API では? • IAsyncEnumerable<T> ◦ TaskSeq を使った実装 • 理由
◦ .NET 標準機能で実装可能 ▪ SSE は .NET 8 だと標準サポートがない ◦ ブラウザ向けではない ▪ だいたいのプログラミング言語、HTTPクライアントライブラリで標準的にサ ポートされている
ポイント Entry Point Driver ① ② DAG API ③
ポイント 1. Driver で逐次データを受け取る 2. Driver から アプリケーション構成レイヤーまで逐次データを返す 3. HTTP
レスポンスとしてクライアントへ逐次データを返す
実装例
ハマった箇所 • do! Task.Yield() や Task.Delay() を入れないと逐次データが返ってこない ◦ まとめて返ってくる
HTTPフレームワーク(ASP.NET Core) TaskSeq(F#) HTTPレスポンスに逐次書き出し(フラッシュ) MoveNextAsync() を呼ぶ 明示的な非同期一時停止 (do! Task.Yield()) 制御をHTTPフレームワークに戻す
要素を受け取る 要素を生成 (yield line) 図解
解説 • フラッシュされるタイミングは、HTTPフレームワークが管理している • 制御を明示的に戻す必要がある ◦ Task.Yield(), Task.Delay()
おわり