### service.lua local event = require('event') local s = require('serialization').serialize local service = {} local function step_coroutine(c) local t = {coroutine.resume(c)} if not t[1] then if coroutine.status(c) == 'dead' then return false else print(debug.traceback(c)) error(t[2], 0) end end return true end function service.periodic(period, f, env) local t local function service_coroutine() while true do local c = coroutine.create(f) while true do if not step_coroutine(c) then break end coroutine.yield() end end end function env.start() if t then return end local c = coroutine.create(service_coroutine) local function step() step_coroutine(c) end t = event.timer(period, step, math.huge) end function env.stop() if not t then return end event.cancel(t) end function env.status() if t then print('running') else print('stopped') end end end return service ### example-service.lua local service = require('service') -- [...] function tick() clear_whole_db() export_relevant_items() end service.periodic(10, tick, _ENV)