Disclaimer:
1. Ниже в этой теме может встречаться код, который может нанести ущерб вашему серверу. Эти образцы предоставлены лишь в ознакомительных целях! Я не несу ответственности за положенные ими сервера Майнкрафта.
2. Я не залазил глубоко в исходники OpenComputers, поэтому могу где-то ошибаться.
Одна из часто встречающихся проблем в OpenComputers - превышение таймаута выполнения программы. При этом выбрасывается ошибка TLWY (too long without yielding).
При лагах сервера эта ошибка может возникать совершенно случайным образом, иногда даже в консоли OpenOS. Иногда компьютер может вообще выключиться с синим экраном.
Чтобы создать стабильную систему, проблему TLWY надо решить. У меня были такие идеи:
1. Обёртки из pcall. Это будет некрасиво выглядеть и понизит максимальную глубину рекурсии.
2. Принудительная вставка yield в код. Проблемы такого подхода - потеря множества событий и необходимость парсинга кода.
3. Принудительное прерывание кода по обращениям к глобальным переменным. Проблема - невозможность отследить вызов анонимной функции.
Например, так не прервать код (function(f) return f(f) end)(function(f) return f(f) end).
4. Интерпретировать байткод Lua. Самое доступное решение, но надо знать формат байткода и обновлять с выходом каждой версии Lua.
5. Переписать виртуальную машину Lua так, чтобы она сама уступала управление другим потокам (тогда ошибка TLWY уйдёт в прошлое). Для этого надо договориться с разработчиками OpenComputers и уметь программировать на Java.
Есть ли какие-то варианты избежания TLWY, которые я упустил?