我正在从外部API(谷歌地理编码)中读取大量数据,并将其写入本地文件。我最初是使用单线程进程来执行此操作的,但此后已将其重写为使用多个线程。
这是我的代码的简化版本
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
函数执行以下操作:
一次执行normalise_one_record
的时间在0.4到1秒之间。
在我的单线程函数中,很容易使用keyboardInterrupt并将我的数据帧写入finally块中的文件中。
从阅读文档和其他问题来看,似乎键盘中断仅被捕获在主线程中,但是我的块执行得太快,无法触发KeyboardInterrupt。
我尝试在try...except
函数及其子函数中添加normalise_one_record
块,但无济于事。
如何早日停止API调用,而又不丢失数据帧结果,也就是将其写入磁盘?
我是python的新手,仅工作了几周,所以对不起任何明显的解决方案,我感到抱歉。