worker.zig

const num_tasks = 25;

pub fn main() !void {
    var arena_instance: std.heap.ArenaAllocator = .init(std.heap.page_allocator);
    defer arena_instance.deinit();
    const arena = arena_instance.allocator();

    const args = try std.process.argsAlloc(arena);
    const env = try std.process.getEnvMap(arena);

    const process_index = try std.fmt.parseInt(usize, args[1], 10);

    var job_client: std.job.Client = try .init(arena, &env);
    defer job_client.deinit();

    var thread_pool: std.Thread.Pool = undefined;
    try thread_pool.init(.{ .allocator = arena, .job_client = &job_client });
    defer thread_pool.deinit();

    // Spawn a bunch of tasks with a variable amount of CPU-intensive work
    var rng: std.Random.DefaultPrng = .init(process_index);
    const r = rng.random();
    for (0..num_tasks) |_| {
        try thread_pool.spawn(doWork, .{ process_index, r.intRangeAtMost(u32, 300_000, 1_000_000) });
    }
}

fn doWork(
    process_index: usize,
    work_amount: u32,
) void {
    std.log.info("[process {d}] start", .{process_index});
    defer std.log.info("[process {d}] stop", .{process_index});

    // Badly simulate single-threaded CPU-intensive work
    for (0..work_amount) |_| {
        for (0..1000) |_| asm volatile ("nop");
    }
}

const std = @import("std");