У меня огромная проблема. Я работаю в проекте Web Python, где после нажатия кнопки вызывается специальный контроллер, а затем вызывается другая функция, присутствующая в модуле python, как показано в моем коде ниже. Однако мне нужна вторая кнопка, которая останавливает процесс контроллера функции потока.
import analyser
def stream():
analyser.get_texts()
response.flash = "Analysis Done."
return ""
Я много искал, как остановить процесс внешним событием (что-то похожее на прерывание), но все решения, которые у меня есть, касались того, как остановить скрипт python с помощью sys.exit() ou программно с помощью оператора возврата, например. Ни одно из этих решений на самом деле не работает для меня.
Я хочу, чтобы пользователь мог остановить эту функцию всякий раз, когда захочет, когда моя функция analyser.get_texts() все время обрабатывается.
Итак, мой вопрос: как остановить выполнение функции потока, нажав кнопку на моем представлении? Благодарю.
Если вы правильно поняли, то ваш анализатор не предоставит свой собственный способ прекратить текущий расчет. Таким образом, вам необходимо обернуть его во что-то, что позволит вам прекратить работу анализатора без его "согласия".
Правильный подход к этому зависит от того, насколько плохо заканчивается анализатор таким образом: он оставляет ресурсы в плохом состоянии?
В зависимости от этого у вас есть несколько вариантов:
Запустите анализ в отдельном процессе. Они могут быть чисто убиты снаружи. Обратите внимание, что обычно не рекомендуется сильно останавливать поток, поэтому вместо этого используйте процессы.
Используйте какое-то асинхронное управление задачами, которое позволяет создавать и останавливать задачи (например, сельдерей).
multiprocessing
модуля , то вы тот , кто создает этот процесс, так что это совершенно нормально использоватьterminate
. Однако обратите внимание, чтоterminate
отправляет толькоSIGTERM
, которые процессы могут игнорировать, поэтому в зависимости от того, как написан ваш анализатор, вы можете использоватьos.kill
для отправкиSIGKILL
процессу. Но сначала попробуйтеProcess.terminate
.