--- layout: site.njk title: zul.ThreadPool ---
Lightweight thread pool with back-pressure and zero allocations after initialization.
The standard library's std.Thread.Pool is designed for large jobs. As such, each scheduled job has non-trivial overhead.
zul.ThreadPool(comptime Fn: type) is a simple and memory efficient way to have pre-initialized threads ready to process incoming work. The ThreadPool is a generic and takes the function to execute as a parameter.
{% highlight zig %}
fn init(
// Allocator is used to create the thread pool, no allocations occur after `init` returns.
allocator: std.mem.Allocator,
opts: .{
// number of threads
.count: u32 = 1,
// The number of pending jobs to allow before callers are blocked.
// The library will allocate an array of this size to hold all pending
// parameters.
.backlog: u32 = 500,
}
) !*ThreadPool(Fn)
{% endhighlight %}
Creates a zul.ThreadPool(Fn).
This is method thread-safe. The threads will be stopped and cleaned up.
Enqueues the arguments to be processed by Fn in a worker thread. This call blocks if the number of pending jobs has reached its configured backlog.