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 inns
. args
:std.meta.ArgsTuple(@TypeOf(func))
Tuple holding arguments forfunc
.dest
:?PromiseOf(func)
or?GeneratorOf(func)
OptionalPromise
orGenerator
struct depending on whetherfunc
returns an iterator.
Return value:
error{OutOfMemory}!void
WorkQueue(ns)
|
PromiseOf(function)
|
GeneratorOf(function)
|
Iterator