mirror of
https://github.com/esx-framework/esx_core.git
synced 2026-08-29 01:08:54 +00:00
72 lines
1.1 KiB
Lua
72 lines
1.1 KiB
Lua
Async = {}
|
|
|
|
function Async.parallel(tasks, cb)
|
|
if #tasks == 0 then
|
|
cb({})
|
|
return
|
|
end
|
|
|
|
local remaining = #tasks
|
|
local results = {}
|
|
|
|
for i = 1, #tasks, 1 do
|
|
CreateThread(function()
|
|
tasks[i](function(result)
|
|
results[#results+ 1] = result
|
|
|
|
remaining = remaining - 1;
|
|
|
|
if remaining == 0 then
|
|
cb(results)
|
|
end
|
|
end)
|
|
end)
|
|
end
|
|
end
|
|
|
|
function Async.parallelLimit(tasks, limit, cb)
|
|
if #tasks == 0 then
|
|
cb({})
|
|
return
|
|
end
|
|
|
|
local remaining = #tasks
|
|
local running = 0
|
|
local queue, results = {}, {}
|
|
|
|
for i=1, #tasks, 1 do
|
|
queue[#queue + 1] = tasks[i]
|
|
end
|
|
|
|
local function processQueue()
|
|
if #queue == 0 then
|
|
return
|
|
end
|
|
|
|
while running < limit and #queue > 0 do
|
|
local task = table.remove(queue, 1)
|
|
|
|
running = running + 1
|
|
|
|
task(function(result)
|
|
results[#results+ 1] = result
|
|
|
|
remaining = remaining - 1;
|
|
running = running - 1
|
|
|
|
if remaining == 0 then
|
|
cb(results)
|
|
end
|
|
end)
|
|
end
|
|
|
|
CreateThread(processQueue)
|
|
end
|
|
|
|
processQueue()
|
|
end
|
|
|
|
function Async.series(tasks, cb)
|
|
Async.parallelLimit(tasks, 1, cb)
|
|
end
|