zig-async - 課題

概要

Zigの非同期プログラミング機能を学び、イベント駆動型のプログラムを実装する課題です。

マンダトリーパート

必須要件

  • 非同期HTTPクライアントの実装
- 複数のURLを並行してフェッチ - タイムアウト処理

  • 非同期ファイル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/O
  • src/event_loop.zig - イベントループ
  • src/main.zig - デモプログラム
  • build.zig - ビルド設定
  • 制限事項

  • std.event は使用可能
  • 外部の非同期ランタイムは使用不可
  • スレッドは最大4つまで