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
8
0
Share
F#でちょっとずつ返す
F#で非同期ストリームを扱う際の内部的な動き
tsumiki
November 08, 2025
More Decks by tsumiki
See All by tsumiki
リーダブルコードLT
tsumiki
0
11
メディアリニューアルした話
tsumiki
0
7
Svelte触ってみた
tsumiki
0
8
スピーダ事業 Product Teamの1週間を考察してみた。
tsumiki
0
10
New Joinerの時に感じていたことを振り返る
tsumiki
0
5
F# AsyncとTask
tsumiki
0
10
評価が大事
tsumiki
0
8
Other Decks in Programming
See All in Programming
The free-lunch guide to idea circularity
hollycummins
0
400
Codex CLI でつくる、Issue から merge までの開発フロー
amata1219
0
280
Rethinking API Platform Filters
vinceamstoutz
0
5.1k
事業会社でのセキュリティ長期インターンについて
masachikaura
0
200
Mastering Event Sourcing: Your Parents Holidayed in Yugoslavia
super_marek
0
130
Redox OS でのネームスペース管理と chroot の実現
isanethen
0
500
モダンOBSプラグイン開発
umireon
0
190
20260315 AWSなんもわからん🥲
chiilog
2
180
Coding as Prompting Since 2025
ragingwind
0
630
S3ストレージクラスの「見える」「ある」「使える」は全部違う ─ 体験から見た、仕様の深淵を覗く
ya_ma23
0
1.2k
PHPのバージョンアップ時にも役立ったAST(2026年版)
matsuo_atsushi
0
280
LM Linkで(非力な!)ノートPCでローカルLLM
seosoft
0
320
Featured
See All Featured
Utilizing Notion as your number one productivity tool
mfonobong
4
280
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
320
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
320
Collaborative Software Design: How to facilitate domain modelling decisions
baasie
0
180
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
0
140
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
990
Leading Effective Engineering Teams in the AI Era
addyosmani
9
1.8k
GraphQLとの向き合い方2022年版
quramy
50
14k
BBQ
matthewcrist
89
10k
A Guide to Academic Writing Using Generative AI - A Workshop
ks91
PRO
1
250
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
170
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.7k
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()
おわり