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
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
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
タクシーアプリ『GO』の バックエンド開発のおける AI利活用と若者のすべて
pyama86
3
1.8k
軽量Java基盤の設計 DIコンテナに頼らない、長期保守と1秒起動の実現 JJUG CCC 2026 Spring
macha64
0
210
プラグインで拡張される Context をtype-safe にする難しさと設計判断
kazupon
2
470
自動レビューエンジンの実装と運用 ~レビューのない世界へ~
kurukuru1999
2
300
tsserverとは何だったのか、これからどうなるのか
nowaki28
1
420
開発体験を左右するライブラリの API 設計 - GraphQL スキーマ構築ライブラリから考える #tskaigi
izumin5210
2
1.4k
GitHub Copilot CLIのいいところ
htkym
2
1.2k
運用エージェントは "作る" から "育てる" へ - 記憶と自己進化の3層設計パターン / self-evolving-agents-three-layer-agent-design
gawa
12
3.3k
Old Dog, New Tricks: The Java 25 Reinvention - JNation
bazlur_rahman
0
140
Swiftのレキシカルスコープ管理
kntkymt
0
200
Hive Metastoreを通して学ぶIceberg REST Catalog ― 仕様から実装まで
okumin
0
310
AI駆動開発勉強会 広島支部 第一回勉強会 AI駆動開発概要とワークショップ
hayatoshimiu
0
410
Featured
See All Featured
Building the Perfect Custom Keyboard
takai
2
780
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
420
GraphQLとの向き合い方2022年版
quramy
50
15k
Measuring Dark Social's Impact On Conversion and Attribution
stephenakadiri
2
200
Testing 201, or: Great Expectations
jmmastey
46
8.2k
Optimising Largest Contentful Paint
csswizardry
37
3.7k
The SEO identity crisis: Don't let AI make you average
varn
0
480
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
8.1k
Statistics for Hackers
jakevdp
799
230k
Writing Fast Ruby
sferik
630
63k
Embracing the Ebb and Flow
colly
88
5.1k
Paper Plane (Part 1)
katiecoart
PRO
0
8.1k
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()
おわり