代码之家  ›  专栏  ›  技术社区  ›  sberry

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

  •  1
  • sberry  · 技术社区  · 15 年前

    我有下面的脚本,大部分都在工作 Link to PasteBin 脚本的工作是启动多个线程,这些线程依次使用popen启动一个子进程。每个子流程的输出如下:

    1
    2
    3
    .
    .
    .
    n
    Done
    

    基本上,子流程是将一个数据库中的表中的1000万条记录传输到另一个数据库中的不同表中,由于模式的不同,在这两个数据库之间有大量的数据处理/操作。如果子流程在执行过程中的任何时候失败(错误记录、重复主键等),或成功完成,则它将输出“done\n”。如果没有更多的记录可供选择进行传输,则它将输出“no data\n”

    我的目的是创建我的脚本“tabletransfer.py”,它将生成许多这样的进程,读取它们的输出,然后输出诸如完成的更新数、剩余时间、经过的时间和每秒传输的次数等信息。

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

    我要找三样东西:

    1. 我想消除这种死锁发生的可能性,这样我就不需要像以前那样频繁地检查它了。锁定有问题吗?
    2. 我这样做是不是不好(gthreading变量来控制生成额外线程的循环…我希望能提出一些改进我的整体方法论的建议。
    3. 如何处理ctrl-c退出?现在我需要终止进程,但假设我应该能够使用信号模块或其他模块来捕获信号并终止线程,对吗?

    我不确定是否应该在这里粘贴我的整个脚本,因为我通常只是粘贴片段。如果我也要贴在这里,请告诉我。

    1 回复  |  直到 15 年前
        1
  •  0
  •   Lee    15 年前

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