通过Bash文件中的for循环运行脚本是否将其强制为单线程?

时间:2019-07-02 19:32:09

标签: bash performance parallel-processing scripting cluster-computing

我有一个Bash脚本,我提交给一个群集,该群集调用一个Python脚本管道,这些脚本被构建为多线程的并行处理工具。我需要在目录中的所有文件上调用此管道,这可以通过for循环来完成。但是,我担心这只会在单线程而不是预期的全部范围上运行操作(即管道)。

要提交的批处理文件如下:

#!/bin/bash
##SBATCH <parameters>

for filename in /path/to/*.txt; do
    PythonScript1.py "$filename"
    PythonScript2.py "$filename"
done

这会按预期进行,还是for循环会妨碍Python脚本的效率/并行处理?

2 个答案:

答案 0 :(得分:2)

如最初所述,PythonScript2.py直到PythonScript1.py返回时才运行,并且for循环直到PythonScript2.py返回时才迭代。

请注意,我说的是“返回”,而不是“完成”;如果PythonScript1.py和/或PythonScript2.py fork或其他因素自行进入后台,则它将在完成之前返回,并在调用bash脚本继续运行时继续处理进行下一步。

您可以将调用脚本与PythonScript1.py &PythonScript2.py &放在后台,但这可能不是您想要的,因为PythonScript1.pyPythonScript2.py因此(可能)将同时运行。

如果您要同时处理多个文件,但希望PythonScript1.pyPythonScript2.py按严格顺序运行,请遵循William Pursell的评论:

for filename in /path/to/*.txt; do
    { PythonScript1.py "$filename"; PythonScript2.py "$filename"; } &
done

答案 1 :(得分:2)

如果您在单个服务器上运行:

parallel ::: PythonScript1.py PythonScript2.py ::: /path/to/*.txt

这将生成{PythonScript1.py,PythonScript2.py}和*.txt的所有组合。这些组合将并行运行,但GNU并行一次只能运行服务器中有CPU线程的数量。

如果您正在集群中的多台服务器上运行,则实际上取决于用于控制集群的系统。在某些系统上,您要求提供服务器列表,然后可以使用ssh进行访问:

get list of servers > serverlist
parallel --slf serverlist ::: PythonScript1.py PythonScript2.py ::: /path/to/*.txt

在其他情况下,您必须将要运行的每个命令提供给排队系统:

parallel queue_this ::: PythonScript1.py PythonScript2.py ::: /path/to/*.txt

在不了解使用哪个集群控制系统的情况下,很难为您提供更多帮助。