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
20
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
F#でちょっとずつ返す
F#で非同期ストリームを扱う際の内部的な動き
tsumiki
November 08, 2025
More Decks by tsumiki
See All by tsumiki
おもしろい組織図の世界
tsumiki
0
43
リーダブルコードLT
tsumiki
0
26
メディアリニューアルした話
tsumiki
0
21
Svelte触ってみた
tsumiki
0
16
スピーダ事業 Product Teamの1週間を考察してみた。
tsumiki
0
19
New Joinerの時に感じていたことを振り返る
tsumiki
0
18
F# AsyncとTask
tsumiki
0
21
評価が大事
tsumiki
0
22
Other Decks in Programming
See All in Programming
PyO3 で既存 Python 評価器を Rust core 化する ー wasm-bindgen でブラウザにも配るための設計
kdash
1
520
ALB ログから Trace を気合で繋げる技術
fohte
7
880
初めての模倣学習とVLA
natsutan
0
500
Can LLMs Replicate 4 Years of Compose Migration? Exploring the boundaries of automation with 279 XML files from a real product
makun
0
130
Go を使い始めて 2 ヶ月の学び / My first two months with Go
contour_gara
0
420
不幸な GC
chencmd
0
890
AIと壁打ちしながら進めるコスト管理
fufuhu
2
1.9k
From 6 People Classroom Meetup to 100 People Regional Conference / FOSS4G Hiroshima 2026
furukawayasuto
0
120
Claude Codeを組織的に動かして月400PRを実現した話
happy_ryo
0
260
AI時代に学ぶ 好きなルール 嫌いなルール Linter編
shorty5121
0
870
AIエージェント時代のコードレビューを設計する
nogu66
6
2.5k
新人はどこまで自力でやり、どこからAIに頼るべきか/エンジニア育成に向き合う_先輩たちの悩みと知見共有会
toppan_digital_dev
1
570
Featured
See All Featured
Leo the Paperboy
mayatellez
8
2.2k
GitHub's CSS Performance
jonrohan
1033
470k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
63
45k
Prompt Engineering for Job Search
mfonobong
0
440
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
320
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
430
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
1.1k
Visualization
eitanlees
152
17k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
The browser strikes back
jonoalderson
0
1.6k
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()
おわり