如何中断没有使用futures.result()或正在等待任务完成的主线程使用的threadPoolExecutor?

时间:2018-09-19 12:47:42

标签: python python-3.x multithreading pandas

我正在从外部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函数执行以下操作:

  • 从数据框中的一行中读取一些信息
  • 调用API
  • 使用锁将API结果写回到数据框,以防止并发写入

一次执行normalise_one_record的时间在0.4到1秒之间。

在我的单线程函数中,很容易使用keyboardInterrupt并将我的数据帧写入finally块中的文件中。

从阅读文档和其他问题来看,似乎键盘中断仅被捕获在主线程中,但是我的块执行得太快,无法触发KeyboardInterrupt。

我尝试在try...except函数及其子函数中添加normalise_one_record块,但无济于事。

如何早日停止API调用,而又不丢失数据帧结果,也就是将其写入磁盘?

我是python的新手,仅工作了几周,所以对不起任何明显的解决方案,我感到抱歉。

0 个答案:

没有答案