如何使用Python并行模块多处理.池在Sun SGE网格上

2024-05-17 13:36:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一段python代码,它在一台机器上运行multiprocessing.Pool,用于许多独立的作业。我想知道在SGE网格上是否有可能使其更加并行,例如,网格的每个节点都为这些独立的作业运行多个线程。在

最初,我有:

# function def
# some_function(param1, param2, param3, process_index)    
func = functools.partial(some_function, file_list, param1, param2, param3)
pool = multiprocessing.Pool(processes=some_integer)
ret_list = pool.map(func, range(processes))
pool.close()

它似乎在本地机器上运行得很好,但是如果按原样提交到SGE网格上,它确实会异常退出而不发出错误消息。提交命令可能如下所示:

^{pr2}$

理想情况下,我希望对python代码的本地版本进行最小的更改,以便它可以在SGE网格上运行,因为在网格上安装新工具或更改任何网格配置都很难不影响其他用户。在

至少,我知道可以重写代码,使每个作业(位于file_list中的文件)的处理由一个qsub命令处理。但我想知道最好的做法是什么。在


Tags: 代码机器网格作业functionsomemultiprocessinglist
1条回答
网友
1楼 · 发布于 2024-05-17 13:36:36

我要做的是让Python脚本读取文件列表和进程数作为命令行参数。这样就更容易叫它了。我将编写一个Bash脚本,该脚本将文件列表作为参数接收,并根据您要执行的操作提交所有作业。通过这种方式,您可以执行两个级别的并行化:在多个节点上(qsub)和每个节点上的多个进程(python多进程)。要正确地完成这项工作,你需要告诉qsub你想要的每个工作的槽数。这是通过在并行环境中提交并指定插槽号(-pe ENV_NAME NBSLOTS)来完成的:

#!/bin/bash

NB_PROCESS_PER_JOB=2
NB_FILE_PER_JOB=3
CPT=0
BUF=""
NUMJOB=1

for i in "$@"; do
    BUF="$BUF '$i'"
    ((CPT++))
    if ((CPT == NB_FILE_PER_JOB)); then
        echo qsub -pe multithread $CPT -V -b yes -cwd -l h_vmem=10G -N jobname$NUMJOB -o grid_job.log -j yes "python worker.py $NB_PROCESS_PER_JOB $BUF"
        BUF=""
        CPT=0
        ((NUMJOB++))
    fi
done
if [[ "$BUF" != "" ]]; then
    echo qsub -pe multithread $CPT -V -b yes -cwd -l h_vmem=10G -N jobname$NUMJOB -o grid_job.log -j yes "python worker.py $NB_PROCESS_PER_JOB $BUF"
fi

Python脚本如下所示:

^{pr2}$

如果您的SGE集群没有任何并行环境,我建议您不要并行化Python脚本(删除-pe ENV_NAME NBSLOTS参数,并且不要在Python脚本中使用pool,或者使它只产生一个进程)。简单的SGE作业不应该是多线程的。如果一个简单的作业是多线程的,它将使用无保留的资源,并且可能会减慢其他用户作业的速度。在

相关问题 更多 >