Python:脚本有效,但似乎在一段时间后陷入僵局

时间:2010-03-20 16:41:19

标签: python multithreading subprocess signals

我有以下脚本,它大部分都在工作Link to PasteBin脚本的工作是启动一些线程,然后每个线程都用Popen启动一个子进程。每个子流程的输出如下:

1
2
3
.
.
.
n
Done

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

我的目的是创建我的脚本“tableTransfer.py”,它会产生许多这些进程,读取它们的输出,然后输出信息,例如已完成的更新次数,剩余时间,已用时间和传输次数每秒。

我昨晚开始运行这个过程,并在今天早上检查,发现它已陷入僵局。没有子程序在运行,仍有记录需要更新,脚本没有退出。它只是坐在那里,不再输出当前信息,因为没有子程序正在运行以更新完成的总数,这是控制输出更新的内容。这是在OS X上运行的。

我正在寻找三件事:

  1. 我想摆脱这种僵局的可能性,所以我不需要经常检查它。锁定有问题吗?
  2. 我是以一种糟糕的方式做这件事(gThreading变量来控制产生额外线程的循环......等等)我会感谢一些改进我整体方法的建议。
  3. 我该如何处理ctrl-c退出?现在我需要杀死进程,但假设我应该能够使用信号模块或其他来捕获信号并杀死线程,是吗?
  4. 我不确定是否应该粘贴我的整个脚本,因为我通常只是粘贴代码段。如果我也应该将它粘贴在这里,请告诉我。

1 个答案:

答案 0 :(得分:0)

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