在python2.4中使用子进程进行并行处理

在python2.4中使用子进程进行并行处理,python,subprocess,python-2.4,qsub,torque,Python,Subprocess,Python 2.4,Qsub,Torque,我想计算一个非常大的矩阵中所有列的成对组合的统计量。我有一个python脚本,名为jaccard.py,它接受一对列并在矩阵上计算这个统计数据 在我的工作机器上,每次计算大约需要10秒,我要完成大约95000次计算。然而,所有这些计算都是相互独立的,我希望使用一个集群,它使用了Torque排队系统和python2.4并行计算使其与扭矩兼容的最佳方法是什么? 我已经使计算本身与python2.4兼容,但是我不知道如何使用子进程并行这些计算,或者是否因为GIL而可以这样做 我的主要想法是保持子进程池

我想计算一个非常大的矩阵中所有列的成对组合的统计量。我有一个python脚本,名为
jaccard.py
,它接受一对列并在矩阵上计算这个统计数据

在我的工作机器上,每次计算大约需要10秒,我要完成大约95000次计算。然而,所有这些计算都是相互独立的,我希望使用一个集群,它使用了Torque排队系统和python2.4并行计算使其与扭矩兼容的最佳方法是什么?

我已经使计算本身与python2.4兼容,但是我不知道如何使用
子进程
并行这些计算,或者是否因为GIL而可以这样做

我的主要想法是保持子进程池的持续运行;完成后,读取输出并使用下一对列开始新的输出。我只需要在计算完成后输出,然后就可以重新开始新的计算

我的想法是这样提交这份工作

qsub -l nodes=4:ppn=8 myjob.sh > outfile
myjob.sh
将调用如下所示的主python文件:

import os, sys
from subprocess import Popen, PIPE
from select import select

def combinations(iterable, r):
    #backport of itertools combinations
    pass

col_pairs = combinations(range(598, 2))

processes = [Popen(['./jaccard.py'] + map(str, col_pairs.next()), 
                   stdout=PIPE)
             for _ in range(8)]

try:
    while 1:
        for p in processes:
            # If process has completed the calculation, print it out
            # **How do I do this part?**

            # Delete the process and add a new one
            p.stdout.close()
            processes.remove(p)
            process.append(Popen(['./jaccard.py'] + map(str, col_pairs.next()),
                                 stdout=Pipe))

# When there are no more column pairs, end the job.
except StopIteration:
    pass
关于如何最好地执行此操作,有什么建议吗?我从未使用过Torque,也不熟悉这种方式的子流程。我尝试在工作站上使用
multiprocessing.Pool
,它与
Pool.map
一起工作,但由于集群使用python2.4,我不确定如何继续


编辑:事实上,经过再三考虑,我可以编写多个qsub脚本,每个脚本只处理95000次计算中的一块。我可以提交16份不同的工作,每个工作做7125次计算。本质上是一样的。

事实上,经过仔细考虑,我可以编写多个qsub脚本,每个脚本只处理95000个计算中的一个块。我可以提交16份不同的工作,每个工作做7125次计算。本质上是一样的。这不是一个解决方案,但考虑到时间和精力的限制,它是一个合适的解决方案