运行 脚本是否通过 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
fork
s 或以其他方式自行进入后台,则它将 return 在完成之前继续处理,同时调用 bash 脚本继续下一步。
您可以让调用脚本使用 PythonScript1.py &
和 PythonScript2.py &
将它们放入后台,但这可能是也可能不是您想要的,因为 PythonScript1.py
和 PythonScript2.py
因此(可能)同时 运行ning。
如果您希望同时处理多个文件,但希望 PythonScript1.py
和 PythonScript2.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
不了解具体使用的是哪个集群控制系统,很难帮到你。
我有一个 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
fork
s 或以其他方式自行进入后台,则它将 return 在完成之前继续处理,同时调用 bash 脚本继续下一步。
您可以让调用脚本使用 PythonScript1.py &
和 PythonScript2.py &
将它们放入后台,但这可能是也可能不是您想要的,因为 PythonScript1.py
和 PythonScript2.py
因此(可能)同时 运行ning。
如果您希望同时处理多个文件,但希望 PythonScript1.py
和 PythonScript2.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
不了解具体使用的是哪个集群控制系统,很难帮到你。