CP
Если разница между «в лоб» и «красиво» занимает тыщу строк — я выберу в лоб в рамках реалий/времени
Size: a a a
CP
AB
CP
AB
S
AB
AB
AB
U
AB
U
U
AB
U
S
function readfile(filename, mode)
local block, done = {}, false
local function pipe(async_chunk)
if not async_chunk or #async_chunk == 0 then
done = true
end
block[#block + 1] = async_chunk
end
asyncioread(filename, mode, pipe)
while not done do coroutine.yield() end
return table.concat(block)
end
local userfunction = function(...)
something = readfile("myfile.txt")
anotherthing = readfile("myfile2.txt")
...
end
local routines = {}
table.insert(routines, coroutine.new(userfunction))
while 1 do
for i, co in ipairs(routines) do
if not coroutine.resume(co) then
table.remove(routines, i)
end
end
process_events_like_asyncioread()
endS
S
S
S
function co_sleep(delay)
local timeout = os.clock() + delay
while os.clock() < timeout do
coroutine.yield()
end
end
Ну и вот, эта функция теперь может параллельно слипать с другими. И на этом принципе вся синхронщина переделывается под асинхронщину, не затрагивая пользовательский код вообще — он всё ещё как бы написан для синхронного взаимодействия, но благодаря этому выполняется асинхронно.S