【发布时间】:2010-03-20 16:41:18
【问题描述】:
我有以下脚本,大部分时间都在工作Link to PasteBin 该脚本的工作是启动多个线程,每个线程依次使用 Popen 启动一个子进程。每个子进程的输出如下:
1
2
3
.
.
.
n
Done
基本上,子进程将 10M 记录从一个数据库中的表传输到另一个数据库中的不同表,由于架构不同,因此在两者之间进行了大量数据按摩/操作。如果子进程在执行过程中的任何时候失败(错误记录、重复的主键等),或者它成功完成,它将输出“Done\n”。如果没有更多记录可供选择进行传输,则它将输出“NO DATA\n”
我的目的是创建我的脚本“tableTransfer.py”,它会产生许多这样的进程,读取它们的输出,然后输出信息,例如完成的更新次数、剩余时间、经过的时间和传输次数每秒。
我昨晚开始运行该进程,今天早上检查它是否已死锁。没有子进程在运行,还有记录要更新,脚本没有退出。它只是坐在那里,不再输出当前信息,因为没有运行子进程来更新完成的总数,这是控制更新输出的内容。这是在 OS X 上运行的。
我正在寻找三样东西:
- 我想消除这种死锁发生的可能性,因此我不需要经常检查它。锁定有问题吗?
- 我这样做的方式是否不好(gThreading 变量来控制生成附加线程的循环...等)我希望能提供一些改进我的整体方法的建议。
- 我应该如何处理 ctrl-c 退出?现在我需要终止进程,但假设我应该能够使用信号模块或其他模块来捕获信号并终止线程,对吗?
我不确定是否应该在此处粘贴整个脚本,因为我通常只粘贴 sn-ps。让我知道我是否也应该将其粘贴在这里。
【问题讨论】:
-
请把代码放在描述中。如果它很大,则表明您可以通过将其剥离到仍然显示问题的最低限度来进行更多诊断。
标签: python multithreading subprocess signals