Python,多处理:如果process.join()永远等待该怎么办?

时间:2015-07-14 13:47:04

标签: python parallel-processing multiprocessing

我在类中定义了一个递归函数。所有功能都是解析文本文件,进行一些计算并将其存储在HDF5文件中。它没有返回任何东西。

在一个核心上运行它非常慢。所以我尝试使用python的multiprocessing模块。我正在创建4个进程并在具有不同参数的for循环中调用相同的函数。

def main():

    f = FileIO() # class which does all the parsing and writing

    start_node = '2'
    maxDepth = 6

    procs = []

    start = time.time()    
    print "Entering for loop"
    for i in xrange(4):
        p = Process(target = f.read_and_write, args = (node+str(i), maxDepth))
        p.start()
        procs.append(p)


    print "Exited for loop"
    for process in procs:
       process.join()

    end = time.time()

    print "Done in ", end - start, "seconds"

if __name__ == '__main__':
    main()

成功且正确地完成了读写操作。唯一的问题是我的程序没有退出。打印Entering for loop后,我在控制台中看不到任何内容。从htop我可以看到四个核心已停止工作。但是我的程序没有退出。

我不知道如何进行调试,因为我不熟悉使用这个multiprocessing模块。我的代码在逻辑上是正确的,并且在不使用multiprocessing模块的情况下工作正常。

  • 如何查看流程状态?
  • 我如何知道代码被卡住的位置?

我正在使用Python 2.7.10 | Anaconda 2.1.0 (64-bit) | ubuntu 14.04 LTS

欢迎任何有关如何调试此类问题的帮助。

1 个答案:

答案 0 :(得分:1)

首先,您应该确保完成这些过程。如果他们进入等待状态,那么他们将永远不会完成。

其次,即使这些流程最终完成,您可能会遇到永远等待,因为问题,例如没有得到答案或类似的答案。您可以将参数传递给join方法,表示超时。这将确保您的主要流程不会永远等待。