zig-async - 課題
概要
Zigの非同期プログラミング機能を学び、イベント駆動型のプログラムを実装する課題です。
マンダトリーパート
必須要件
- 非同期HTTPクライアントの実装
- 非同期ファイルI/Oの実装
- イベントループの実装
インターフェース
const std = @import("std");
pub const AsyncClient = struct {
allocator: std.mem.Allocator,
pub fn init(allocator: std.mem.Allocator) AsyncClient {
// 実装
}
pub fn fetch(self: *AsyncClient, url: []const u8) ![]const u8 {
// 非同期フェッチ
}
pub fn fetchAll(self: *AsyncClient, urls: []const []const u8) ![][]const u8 {
// 複数URLを並行フェッチ
}
};
pub const AsyncFileReader = struct {
pub fn readFile(path: []const u8) ![]const u8 {
// 非同期ファイル読み込み
}
pub fn readFiles(paths: []const []const u8) ![][]const u8 {
// 複数ファイルを並行読み込み
}
};
pub const EventLoop = struct {
pub fn init() EventLoop {
// 実装
}
pub fn setTimeout(self: *EventLoop, callback: fn() void, ms: u64) void {
// タイマー設定
}
pub fn run(self: *EventLoop) void {
// イベントループ実行
}
};
使用例
var client = AsyncClient.init(allocator);
// 複数URLを並行フェッチ
const urls = [_][]const u8{
"https://api.example.com/data1",
"https://api.example.com/data2",
"https://api.example.com/data3",
};
const results = try client.fetchAll(&urls);
for (results) |data| {
std.debug.print("Got: {s}\n", .{data});
}
ボーナスパート
ボーナス1: チャンネル
- Go言語風のチャンネル実装
- 複数プロデューサー/コンシューマー
ボーナス2: 非同期ストリーム
- 遅延評価ストリーム
- パイプライン処理
ボーナス3: 接続プール
- HTTP接続のプール管理
- 再利用による性能最適化
src/async_client.zig- HTTPクライアントsrc/async_file.zig- ファイルI/Osrc/event_loop.zig- イベントループsrc/main.zig- デモプログラムbuild.zig- ビルド設定std.eventは使用可能- 外部の非同期ランタイムは使用不可
- スレッドは最大4つまで