Уничтожение бесконечных циклов в Java/Clojure
Ответы на некоторые "потенциальные ответы"
Вы должны посыпать "прерывания" в ваши темы
Я не пишу свой код с намерением сделать его длинным процессом / бесконечным циклом; просто в процессе разработки я случайно пишу код, который оказывается бесконечным циклом, поэтому я никогда не смогу заранее запланировать установку "проверки на прерывание потока" в коде.
Вопрос:
По мере знакомства с Java/Clojure/Swank и развитием инкрементного кода. Мне очень легко случайно написать функцию clojure, которая заканчивается бесконечным циклом - и запустить ее. Затем это продолжается и привязывает JVM, заставляя вентиляторы на моем ноутбуке раскручиваться - и, в основном, мне приходится убивать всю JVM, чтобы просто избавиться от одного запущенного потока.
Теперь, в любом случае, я могу как-то безопасно убить эти замыкающие нити? Мне хорошо известно, что Thread.stop имеет различные небезопасные последствия (например, удержание блокировок, которые могут понадобиться другим потокам и т. Д.) - однако, это здесь функции замыкания, которые имеют бесконечный цикл - и я делаю их вне любой STM - так что мне интересно, есть ли способ безопасно убить эти темы.
Спасибо!
4 ответа
Я не думаю, что существует полный ответ, хотя есть некоторые неполные, но все же полезные вещи:
- Сначала я ударил
ctrl-c ctrl-c
из ответа, который убивает поток переднего плана, который получает 99% моих распространенных ошибок. - Затем, если это не удается, я иду на терминал и
kill
команда. - после этого его
M-x slime-quit-lisp
,clojure-jack-in
Как насчет написания макроса для создания этих циклов, и этот макрос может вводить код в шаги цикла, чтобы периодически проверять что-то, что указывает на его выход из цикла, например, наличие временного файла в /tmp. Таким образом, чтобы выйти из бесконечного цикла, вам просто нужно создать этот временный файл.
В бета-версии Eclipse/Counterclockwise есть возможность вручную прекратить запуск (выход из-под контроля) потоков без остановки REPL. Я люблю эту функцию по той же причине, по которой вы хотели бы ее иметь.
Он использует бета-версию NREPL 0.2.0, я думаю, через clojure.tools.nrepl.middleware.interruptible-eval. Эту функцию должна поддерживать не только клиент Eclipse/CCW NREPL 0.2.0, но и последняя версия REPL-y (CTRL-C по умолчанию для остановки потока, CTRL-D для остановки REPL).
Теоретически, как упоминалось в комментариях, это очень сложная проблема, которую действительно нужно решить.
Лучшая надежда на практическое решение...
Я предполагаю, что вам нужен более надежный и безопасный способ уничтожения и анализа активности в запущенных потоках clojure.,, И для этого следует использовать JPS, так как JPS контролирует все процессы Java, включая все, что вы делаете в стандартном замыкании.
Я всегда использую JPS для такого рода вещей, потому что он может быть использован для отображения имен процессов определенных классов Java, ВКЛЮЧАЯ имена классов... Возможность узнать класс, который первоначально вызвал процесс, дает вам довольно точное представление о " что ты на самом деле убиваешь.
doolittle-5:~ Jpeerindex$ jps -l
61133 jline.ConsoleRunner
58998 start.jar
61161 sun.tools.jps.Jps
51866 jline.ConsoleRunner
В этом случае, так как "lein repl" (clojure repl) запускается через jline (основным классом является ConsoleRunner), мы можем видеть его таковым.
Если вам действительно нужно увидеть детали, вы можете выбрать любой из этих процессов и вызвать их с помощью jstack:
$> jstack 51866
"Рабочий банды № 0 (параллельные потоки GC)" prio=9 tid=101802800 nid=0x1017f9000, работоспособный
"Рабочий банды № 1 (параллельные потоки GC)" prio = 9 tid = 101803800 nid = 0x102301000 runnable
"Параллельная нить GC-потока очистки" prio=9 tid=10184e000 nid=0x1093f0000, работоспособный "Поток периодических задач VM" prio=10 tid=1018a4000 nid=0x10a310000, ожидание при условии
"Поток ловушки исключений" prio=10 tid=101802000 nid=0x100704000 запускаемых глобальных ссылок JNI: 137
В этом случае вы сможете почувствовать, нет ли каких-либо реальных проблем в ваших темах, точно их идентифицировать, убить их с уверенностью и т. Д...