Горячая перезагрузка#
amxpy deploy или amxpy reload <плагин> меняют плагин на работающем сервере: игроки остаются,
карта не перезапускается.
Что происходит#
- Старая версия получает
Unloadсreason="reload", вызываются@plugin.on_unload. - Сохраняется состояние:
PlayerState(keep=True)и значенияplugin.keep(...)(см. ниже). - Задачи старой версии отменяются, обработчики, команды и меню снимаются.
- Загружается новая версия:
Initприходит сe.hot_reload = True. - Если новая версия упала при запуске, возвращается старая — с тем же состоянием.
Что переживает перезагрузку#
PlayerState(keep=True) переносится через pickle. Новая версия находит его по адресу
«модуль:имя переменной» — переименуете переменную, данные не найдутся.
Всё остальное — обычные глобальные переменные модулей — создаётся заново.
Когда нужен рестарт сервера#
Нативы Pawn-плагинов привязываются только при старте сервера. Поэтому:
- новый натив заработает в Pawn после рестарта;
- смена сигнатуры натива — перезагрузка будет отклонена с сообщением
native … changed its signatureв логе, старая версия продолжит работать.
Тело натива и всё остальное можно менять на лету.
Режимы#
amxpy_hotreload |
|
|---|---|
0 |
перезагрузка выключена |
1 |
по команде amxpy reload и amxpy deploy (по умолчанию) |
2 |
ещё и сама, когда файл пакета на сервере изменился |
Проверить в тесте#
def test_kills_survive_reload(server: FakeServer) -> None:
server.load("plugins/stats.py")
bob = server.join("Bob")
...
assert server.reload("stats") # пересобрать и перезагрузить из исходника
Подробнее — Тестирование.