Как я могу прервать threadPoolExecutor, который используется без futures.result () или основного потока, который ожидает завершения задач? - PullRequest
0 голосов
/ 19 сентября 2018

Я читаю много данных из внешнего API (геокодирование Google) и записываю их в локальный файл.Первоначально я делал это с использованием однопоточного процесса, но с тех пор переписал его для использования нескольких потоков.

Вот упрощенная версия моего кода

input_dataframe = pd.read_excel(input_path)

keyboard_interrupt = False

with ThreadPoolExecutor(max_workers=10) as executor:
        for iterator in range(0, row_count):
            if not keyboard_interrupt:
                try:
                    executor.submit(normalise_one_record, iterator)
                except(KeyboardInterrupt):
                    print("Stopped by user - loop")
                    keyboard_interrupt = True
            else:
                break

input_dataframe.to_excel(output_path)

Поскольку я не хочу спамитьAPI, я ограничиваю количество параллельных вызовов, которые я делаю, ограничивая моих работников.

Функция normalise_one_record выполняет следующие действия:

  • Чтение некоторой информации из строки в фрейме данных
  • Вызов API
  • ЗаписьРезультаты API возвращаются к фрейму данных, используя блокировку для предотвращения одновременной записи

Одно выполнение normalise_one_record занимает от 0,4 до 1 секунды.

В моей однопоточной функции было легко использовать клавиатурное прерывание и записывать мой фрейм данных в файл в блоке finally.

Из чтения документов и других вопросов это похоже на прерывание клавиатурыперехватывается только в основном потоке, но мой блок выполняется слишком быстро, чтобы вызвать KeyboardInterrupt.

Я пытался добавить блоки try...except внутри функции normalise_one_record и ее подфункций, но безрезультатно.

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

Я немного новичок в python, проработав над ним всего пару недельПрошу прощения, если пропускаю какие-либо очевидные решения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...