Я читаю много данных из внешнего 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, проработав над ним всего пару недельПрошу прощения, если пропускаю какие-либо очевидные решения.