Обновлена 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 dofor _, tuple in box.space.pokemons.index.status:pairs(self.state.CAUGHT) dobox.space.pokemons:update(tuple[self.ID],{{'=', self.STATUS, self.state.ACTIVE}})endfiber.sleep(self.respawn_time)endend
и вызовем её как файбер в start():
start = function(self)-- create spaces and indexes<...>-- create models<...>-- compile models<...>-- start the gameself.pokemon_model = compiled_pokemonself.player_model = compiled_playerfiber.create(self.respawn, self)log.info('Started')-- errors if schema creation or compilation fails<...>end