Python,多处理:如果 process.join() 永远等待怎么办?
Python, Multiprocessing: what to do if process.join() waits forever?
我在 class 中定义了一个递归函数。该函数所做的只是解析文本文件,进行一些计算并将其存储在 HDF5 文件中。它没有 return 任何东西。
运行 它在一个核心上非常慢。所以我尝试使用 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
欢迎任何有关如何调试此类问题的帮助。
首先,您应该确保进程将完成。如果他们进入等待状态,那么他们将永远不会完成。
其次,即使这些过程最终完成,您也可能会遇到永远的等待,由于问题,比如没有得到答案等。您可以将参数传递给 join
方法,表示超时。这将确保您的主进程不会永远等待。
我在 class 中定义了一个递归函数。该函数所做的只是解析文本文件,进行一些计算并将其存储在 HDF5 文件中。它没有 return 任何东西。
运行 它在一个核心上非常慢。所以我尝试使用 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
欢迎任何有关如何调试此类问题的帮助。
首先,您应该确保进程将完成。如果他们进入等待状态,那么他们将永远不会完成。
其次,即使这些过程最终完成,您也可能会遇到永远的等待,由于问题,比如没有得到答案等。您可以将参数传递给 join
方法,表示超时。这将确保您的主进程不会永远等待。