Остановка обработки функции извне

1

У меня огромная проблема. Я работаю в проекте Web Python, где после нажатия кнопки вызывается специальный контроллер, а затем вызывается другая функция, присутствующая в модуле python, как показано в моем коде ниже. Однако мне нужна вторая кнопка, которая останавливает процесс контроллера функции потока.

import analyser
def stream():
    analyser.get_texts()
    response.flash = "Analysis Done."
    return ""

Я много искал, как остановить процесс внешним событием (что-то похожее на прерывание), но все решения, которые у меня есть, касались того, как остановить скрипт python с помощью sys.exit() ou программно с помощью оператора возврата, например. Ни одно из этих решений на самом деле не работает для меня.

Я хочу, чтобы пользователь мог остановить эту функцию всякий раз, когда захочет, когда моя функция analyser.get_texts() все время обрабатывается.

Итак, мой вопрос: как остановить выполнение функции потока, нажав кнопку на моем представлении? Благодарю.

Теги:
python-3.x
multithreading

1 ответ

1
Лучший ответ

Если вы правильно поняли, то ваш анализатор не предоставит свой собственный способ прекратить текущий расчет. Таким образом, вам необходимо обернуть его во что-то, что позволит вам прекратить работу анализатора без его "согласия".

Правильный подход к этому зависит от того, насколько плохо заканчивается анализатор таким образом: он оставляет ресурсы в плохом состоянии?

В зависимости от этого у вас есть несколько вариантов:

  • Запустите анализ в отдельном процессе. Они могут быть чисто убиты снаружи. Обратите внимание, что обычно не рекомендуется сильно останавливать поток, поэтому вместо этого используйте процессы.

  • Используйте какое-то асинхронное управление задачами, которое позволяет создавать и останавливать задачи (например, сельдерей).

  • 0
    Флориан, я получил ваше объяснение, но у меня все еще есть некоторые сомнения. В документации по многопроцессорности говорится: обратите внимание, что методы start (), join (), is_alive (), terminate () и exitcode должны вызываться только тем процессом, который создал объект процесса . Я думал в call terminate () , однако, что вызов должен выполняться только процессом, который создал «дочерний» процесс. Это не соответствует моему требованию.
  • 0
    Если запустить анализатор в отдельном процессе с помощью multiprocessing модуля , то вы тот , кто создает этот процесс, так что это совершенно нормально использовать terminate . Однако обратите внимание, что terminate отправляет только SIGTERM , которые процессы могут игнорировать, поэтому в зависимости от того, как написан ваш анализатор, вы можете использовать os.kill для отправки SIGKILL процессу. Но сначала попробуйте Process.terminate .

Ещё вопросы

Сообщество Overcoder
Наверх
Меню