Lua coroutine worker pool with error capture
Lua
local function worker_pool(jobs, size, handle)
local results, errors, n = {}, {}, 0
local function worker()
while n < #jobs do
local i = n + 1; n = i
local ok, res = pcall(handle, jobs[i], i)
if ok then results[i] = res else errors[i] = tostring(res) end
coroutine.yield()
end
end
local cos = {}
for i = 1, math.min(size or 4, #jobs) do cos[i] = coroutine.create(worker) end
local running = #cos > 0; while running do
running = false
for i = 1, #cos do
coroutine.resume(cos[i])
running = running or coroutine.status(cos[i]) ~= 'dead'
end
end
return results, errors
end
return worker_pool