【问题标题】:Python: Script works, but seems to deadlock after some timePython:脚本有效,但一段时间后似乎死锁
【发布时间】: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 上运行的。

我正在寻找三样东西:

  1. 我想消除这种死锁发生的可能性,因此我不需要经常检查它。锁定有问题吗?
  2. 我这样做的方式是否不好(gThreading 变量来控制生成附加线程的循环...等)我希望能提供一些改进我的整体方法的建议。
  3. 我应该如何处理 ctrl-c 退出?现在我需要终止进程,但假设我应该能够使用信号模块或其他模块来捕获信号并终止线程,对吗?

我不确定是否应该在此处粘贴整个脚本,因为我通常只粘贴 sn-ps。让我知道我是否也应该将其粘贴在这里。

【问题讨论】:

  • 请把代码放在描述中。如果它很大,则表明您可以通过将其剥离到仍然显示问题的最低限度来进行更多诊断。

标签: python multithreading subprocess signals


【解决方案1】:

您的脚本中有几个地方可以在不释放锁定的情况下返回。这可能会导致问题 - 第 97 行和第 99 行 - 这是 try: finally: 块可以帮助您很多的地方,因为您可以确保正确调用发布。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-08
    • 2012-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多