Как остановить функцию от завершения своего кода в цикле событий - PullRequest
0 голосов
/ 19 февраля 2019

У меня есть цикл обработки событий, который выполняет функцию асинхронно.Однако эта функция генерирует большие данные, поэтому выполнение программы будет немного длинным, когда программа посетит эту функцию.Я также реализовал кнопку остановки, чтобы приложение выходило из этой функции, даже если цикл обработки событий еще не завершен.Проблема в том, как немедленно выйти из этой функции или как убить поток в asyncio.

Я уже пытался использовать флаг в функции, но выполнение функции достаточно быстрое, чтобы проверить флаг передпользователь нажимает на кнопку остановки.Короче говоря, поток уже работает в фоновом режиме.

def execute_function(self, function_to_execute, *args):
    self.loop = asyncio.get_event_loop()
    self.future = self.loop.run_in_executor(self._executor, function_to_execute, *args)
    return self.future

def stop_function(self):
    if self._executor:
        self._executor.shutdown(wait=False)
    self.loop.stop()
    self.loop.close()

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

1 Ответ

0 голосов
/ 19 февраля 2019

Вы можете использовать threading.Event, передавая его вашей функции блокировки

event = threading.Event()
future = loop.run_in_executor(executor, blocking, event)   
# When done
event.set()

Функция блокировки просто должна проверить is_set, а когда вы хотите остановить ее, просто вызовите event.set (), как указано выше.

def blocking(event):
  while 1:
    time.sleep(1)
    if event.is_set():
      break
...