MTA Lua Asynchronous Computing
Description:
MTA:SA Async library. If you have some heavy cyclic operations, that are dropping "Infinite/too long execution", or operations that "freeze" your server for couple seconds, you can use this library. It supports multiple running threads at a time.
Installation & Instructions:
https://github.com/Inlife/mta-lua-async
Enable debug, if you need to (it will print some useful information in server console)
Async:setDebug(true);
Iterate on interval from 1 to 50,000,000 while calculating some data on every iteration
(if you run standart "for" cycle, mta server will "freeze" for several seconds)
Async:iterate(1, 50000000, function(i)
local x = (i + 2) * i; -- heavy opreation
outputServerLog(x);
end);
Iterate over big array of data
Async:foreach(vehicles, function(vehicle)
vehicle:setHealth(1000);
end);
There also an options for changing speed of your async caclulations:
Async:setPriority("low"); -- better fps
async:setPriority("normal"); -- medium
async:setPriority("high"); -- better perfomance
-- or, more advanced
async:setPriority(500, 100);
-- 500ms is "sleeping" time,
-- 100ms is "working" time, for every current async thread
Example:
local _connection; -- initialized database connection
local vehicles = {};
Async:setDebug(true);
Async:setPriority("low");
dbQuery(function(qh)
local data = dbPoll(qh, 0);
Async:foreach(data, function(vehicle)
local _vehicle = createVehicle( vehicle.model, vehicle.x, vehicle.y, vehicle.z );
-- other stuff
-- ...
table.insert(vehicles, _vehicle);
end);
-- and run dummy cycle at the same time (just for fun )
Async:iterate(0, 500000, function(num)
outputServerLog(num);
end);
end, _connection, "SELECT * FROM vehicles");