Остановить все потоки с помощью threading.Событие()

#python-3.x #python-asyncio #python-multithreading

#python-3.x #python-asyncio #python-многопоточность

Вопрос:

Я создаю несколько потоков для выполнения функции, которая генерирует PDF. Этот процесс занимает много времени, поэтому у пользователя есть выбор отменить выполнение.

Чтобы остановить поток, я знаю, что могу использовать threading.Event() , чтобы проверить, будет ли он установлен. Однако процесс функции, которую я выполняю в моем цикле событий, является прямым / линейным (нет цикла для регулярной проверки, установлено ли событие).

 --threading class--

    def execute_function(self, function_to_execute, total_executions, execution_time, controller):
        self.event = threading.Event()
        self.event_list.append(self.event)
        self.loop = asyncio.get_event_loop()
        self.future = self.loop.run_in_executor(self._executor, function_to_execute, self.event, total_executions,
                                                execution_time, controller)


    def stop_executor(self):
        for event in self.event_list:
            event.set()
        self.event = None

        if self._executor:
            self._executor.shutdown(wait=False)
  
     def *function_to_execute*(self, event, total_execution, seconds=SECONDS_DEFAULT, controller=None):
        self.event = event
        self.controller = controller
        ...


  

Моя проблема в том, что я не могу реализовать событие для прерывания потоков без зацикливания для регулярной проверки события.
Есть ли какой-либо другой способ остановить все эти потоки?
Или, если я все еще буду использовать событие, есть ли какая-либо другая логика для его реализации?

Заранее спасибо!

Комментарии:

1. Даже функция без цикла может реализовывать случайные проверки флага. Что делает функция, когда установлено событие остановки?

2. @user4815162342, да, но проблема в том, что когда я нажимаю кнопку stop, мне нужно немедленно остановить процесс. Однако, поскольку это функция без цикла, мне нужно реализовать событие остановки несколько раз. Я все еще не знаю, как реализовать событие остановки для функции.

3. Но в чем проблема с добавлением проверок в функцию без цикла? Я не думаю, что существует волшебный способ, чтобы проверка происходила сама по себе, вы должны его реализовать…

4. @user4815162342 эта функция также вызывает другие функции, которые выполняют большие задачи. Если, например, я добавлю средство проверки с самого начала и в конце этой функции, оно все равно выполнит процесс перед проверкой события. Мы в одной лодке? Ха-ха!

5. Да, вам нужно добавить проверку ко всем функциям.