Python:脚本可以工作,但一段时间后似乎会死锁

Python:脚本可以工作,但一段时间后似乎会死锁,python,multithreading,subprocess,signals,Python,Multithreading,Subprocess,Signals,我有下面的脚本,它在很大程度上起作用。该脚本的任务是启动多个线程,这些线程依次使用Popen启动子进程。每个子流程的输出如下所示: 1 2 3 . . . n Done 基本上,由于模式不同,子流程将10M记录从一个数据库中的表传输到另一个数据库中的不同表,其间会进行大量数据按摩/操作。如果子进程在执行过程中的任何时候失败(坏记录、重复主键等),或者成功完成,它将输出“Done\n”。如果没有更多记录可供选择用于传输,则它将输出“无数据\n” 我的意图是创建脚本“tableTransfer.p

我有下面的脚本,它在很大程度上起作用。该脚本的任务是启动多个线程,这些线程依次使用Popen启动子进程。每个子流程的输出如下所示:

1
2
3
.
.
.
n
Done
基本上,由于模式不同,子流程将10M记录从一个数据库中的表传输到另一个数据库中的不同表,其间会进行大量数据按摩/操作。如果子进程在执行过程中的任何时候失败(坏记录、重复主键等),或者成功完成,它将输出“Done\n”。如果没有更多记录可供选择用于传输,则它将输出“无数据\n”

我的意图是创建脚本“tableTransfer.py”,它将生成许多这样的进程,读取它们的输出,并依次输出信息,如完成的更新数量、剩余时间、经过的时间和每秒传输的数量

我昨晚开始运行这个进程,今天早上检查它是否已经死锁。没有运行子进程,仍有记录要更新,并且脚本尚未退出。它只是坐在那里,不再输出当前信息,因为没有运行子进程来更新完成的总数,而完成的总数是控制更新输出的。这是在OSX上运行的

我在寻找三件事:

  • 我想消除这种死锁发生的可能性,所以我不需要经常检查它。锁有什么问题吗
  • 如果我这样做的方式不好(gThreading变量用于控制生成额外线程的循环…等等),我希望能提出一些建议来改进我的总体方法
  • 我应该如何处理ctrl-c退出?现在我需要终止进程,但假设我应该能够使用信号模块或其他模块捕获信号并终止线程,对吗

  • 我不确定是否应该在这里粘贴整个脚本,因为我通常只粘贴片段。请告诉我是否也应该将其粘贴到此处。

    您的脚本中有一些地方可以在不释放锁的情况下返回。这可能会导致问题-第97行和第99行-这就是try:finally:blocks可以帮助您的地方,因为您可以确保正确调用该版本。

    请在描述中输入代码。如果它很大,这是一个信号,表明你可以通过将它剥离到仍然显示问题的最小值来进行更多诊断。