我有下面的脚本,大部分都在工作
Link to PasteBin
脚本的工作是启动多个线程,这些线程依次使用popen启动一个子进程。每个子流程的输出如下:
1
2
3
.
.
.
n
Done
基本上,子流程是将一个数据库中的表中的1000万条记录传输到另一个数据库中的不同表中,由于模式的不同,在这两个数据库之间有大量的数据处理/操作。如果子流程在执行过程中的任何时候失败(错误记录、重复主键等),或成功完成,则它将输出“done\n”。如果没有更多的记录可供选择进行传输,则它将输出“no data\n”
我的目的是创建我的脚本“tabletransfer.py”,它将生成许多这样的进程,读取它们的输出,然后输出诸如完成的更新数、剩余时间、经过的时间和每秒传输的次数等信息。
我昨晚开始运行这个过程,今天早上检查时发现它已经死锁了。没有运行子进程,仍有要更新的记录,并且脚本尚未退出。它只是坐在那里,不再输出当前信息,因为没有运行子进程来更新完成的总数,这就是控件更新输出的内容。这是在OSX上运行的。
我要找三样东西:
-
我想消除这种死锁发生的可能性,这样我就不需要像以前那样频繁地检查它了。锁定有问题吗?
-
我这样做是不是不好(gthreading变量来控制生成额外线程的循环…我希望能提出一些改进我的整体方法论的建议。
-
如何处理ctrl-c退出?现在我需要终止进程,但假设我应该能够使用信号模块或其他模块来捕获信号并终止线程,对吗?
我不确定是否应该在这里粘贴我的整个脚本,因为我通常只是粘贴片段。如果我也要贴在这里,请告诉我。