zig/worker.zig
Matthew Lugg 7d4e06b6d9
DO NOT MERGE: jobserver usage example with std.Thread.Pool
Co-authored-by: Jacob Young <jacobly0@users.noreply.github.com>
2025-12-05 11:47:13 +00:00

41 lines
1.3 KiB
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");