С учетом предоставленных вами ограничений:
- Пользовательский код, который вы не можете контролировать.
- Невозможно принудительно выполнить проверки для
Thread.interrupted()
.
- Невозможно использовать
Thread.stop()
.
- Невозможно поместить код пользователя в тюрьму процесса.
Ответ на ваш вопрос: «Нет, нет способа справиться с этой ситуацией». Вы в значительной степени систематически проектировали вещи, чтобы у вас был нулевой контроль над ненадежным сторонним кодом. Это ... неоптимальный дизайн.
Если вы хотите быть в состоянии справиться с чем-либо, вам придется ослабить одно (или предпочтительно больше!) Из вышеуказанных ограничений.
Отредактировано, чтобы добавить:
Может быть, вы можете обойти это, не заставляя своих клиентов менять код, если это (другое) ограничение. Запустите код Ruby в другом процессе и используйте какой-либо механизм IPC для взаимодействия с вашей основной кодовой базой. Чтобы избежать принудительного кодирования Ruby-кода для использования явного IPC, добавьте набор прокси-объектов для вашего API, которые выполняют IPC за кулисами, которые сами вызывают прокси-объекты на вашем собственном сервере. Таким образом, ваш клиентский код получает иллюзию работы внутри вашего сервера, в то время как вы заключаете этот код в тюрьму в своем собственном процессе (что в конечном итоге вы можете kill -9
в качестве окончательного разрешения, если оно придет к этому).
Позже вы захотите отучить своих клиентов от иллюзии, поскольку IPC и нативные вызовы сильно отличаются и скрывают, что за прокси-сервером может быть зло, но это временная задержка, которую вы можете использовать, пока вы устареть API и перенести своих клиентов на новые API.