zigar.thread.WorkQueue(ns).push(self, func, args, dest) - chung-leong/zigar GitHub Wiki

Push a work item onto the queue to be be worked on by the first available worker thread.

Usage

const std = @import("std");
const zigar = @import("zigar");

var work_queue: zigar.thread.WorkQueue(thread_ns) = .{};
var gpa = std.heap.DebugAllocator(.{}).init;
const allocator = gpa.allocator();

pub fn startup() !void {
    try work_queue.init(.{ .allocator = allocator });
}

pub fn shutdown(promise: zigar.function.Promise(void)) void {
    work_queue.deinitAsync(promise);
}

pub fn getOneNumber(promise: zigar.function.PromiseOf(thread_ns.getOneNumber)) !void {
    try work_queue.push(thread_ns.getOneNumber, .{}, promise);
}

pub fn getMultipleNumbers(generator: zigar.function.GeneratorOf(thread_ns.getMultipleNumbers)) !void {
    try work_queue.push(thread_ns.getMultipleNumbers, .{}, generator);
}

const thread_ns = struct {
    pub fn getOneNumber() i32 {
        return 1234;
    }

    pub fn getMultipleNumbers() NumberIterator {
        return NumberIterator{ .current = 7, .last = 10 };
    }

    const NumberIterator = struct {
        current: i32,
        last: i32,

        pub fn next(self: *@This()) ?i32 {
            if (self.current <= self.last) {
                defer self.current += 1;
                return self.current;
            } else return null;
        }
    };
};
import { getOneNumber, getMultipleNumbers, startup, shutdown } from './work-queue-example-6.zig';

startup();
try {
    const number = await getOneNumber();
    console.log(`One number: ${number}`);
    console.log(`Multiple numbers:`);
    for await (const number of getMultipleNumbers()) {
        console.log(number);
    }
} finally {
    await shutdown();
}
One number: 1234
Multiple numbers:
7
8
9
10

Arguments:

  • self: @This()
  • comptime func: anytype
    A public function in ns.
  • args: std.meta.ArgsTuple(@TypeOf(func)) Tuple holding arguments for func.
  • dest: ?PromiseOf(func) or ?GeneratorOf(func) Optional Promise or Generator struct depending on whether func returns an iterator.

Return value:

error{OutOfMemory}!void


WorkQueue(ns) | PromiseOf(function) | GeneratorOf(function) | Iterator