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

Does running scripts via for-loop in Bash file force them to be single-threaded?

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

提交的批处理文件如下所示:

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

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

这会按预期工作,还是 for 循环会妨碍 Python 脚本的 efficiency/parallel 处理?

正如最初写的那样,PythonScript2.py 不会 运行 直到 PythonScript1.py return 秒,并且 for 循环不会迭代直到 PythonScript2.py returns.

注意我说的是"returns",不是"finishes";如果 PythonScript1.py and/or PythonScript2.py forks 或以其他方式自行进入后台,则它将 return 在完成之前继续处理,同时调用 bash 脚本继续下一步。

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

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

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

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

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

不了解具体使用的是哪个集群控制系统,很难帮到你。