Tarantool CE/EE Documentation portal logo
Помощь
Обновлена 15 сентября 2026 г. в 08:55

Файберы, передача управления и кооперативная многозадачность

Но подождите! Если запустить его, как показано выше — self.respawn() — функция будет выполнена только один раз, как и все остальные методы. Но нужно выполнять respawn() каждые 60 секунд. Создание файбера — это способ Tarantool обеспечить постоянную работу логики приложения в фоновом режиме.

Файбер — это набор инструкций, которые выполняются с кооперативной многозадачностью: инструкции содержат сигналы передачи управления, при которых управление передаётся другому файберу.

Запустим respawn() в файбере, чтобы она работала в фоновом режиме постоянно. Для этого нужно изменить respawn():

respawn = function(self)    -- let's give our fiber a name;    -- this will produce neat output in fiber.info()    fiber.name('Respawn fiber')    while true do        for _, tuple in box.space.pokemons.index.status:pairs(                self.state.CAUGHT) do            box.space.pokemons:update(                tuple[self.ID],                {{'=', self.STATUS, self.state.ACTIVE}}            )        end        fiber.sleep(self.respawn_time)    endend

и вызовем её как файбер в start():

start = function(self)    -- create spaces and indexes        <...>    -- create models        <...>    -- compile models        <...>    -- start the game       self.pokemon_model = compiled_pokemon       self.player_model = compiled_player       fiber.create(self.respawn, self)       log.info('Started')    -- errors if schema creation or compilation fails       <...>end