我有一个Bash脚本,我提交给一个群集,该群集调用一个Python脚本管道,这些脚本被构建为多线程的并行处理工具。我需要在目录中的所有文件上调用此管道,这可以通过for循环来完成。但是,我担心这只会在单线程而不是预期的全部范围上运行操作(即管道)。
要提交的批处理文件如下:
#!/bin/bash
##SBATCH <parameters>
for filename in /path/to/*.txt; do
PythonScript1.py "$filename"
PythonScript2.py "$filename"
done
这会按预期进行,还是for循环会妨碍Python脚本的效率/并行处理?
答案 0 :(得分:2)
如最初所述,PythonScript2.py
直到PythonScript1.py
返回时才运行,并且for
循环直到PythonScript2.py
返回时才迭代。
请注意,我说的是“返回”,而不是“完成”;如果PythonScript1.py
和/或PythonScript2.py
fork
或其他因素自行进入后台,则它将在完成之前返回,并在调用bash脚本继续运行时继续处理进行下一步。
您可以将调用脚本与PythonScript1.py &
和PythonScript2.py &
放在后台,但这可能不是您想要的,因为PythonScript1.py
和PythonScript2.py
因此(可能)将同时运行。
如果您要同时处理多个文件,但希望PythonScript1.py
和PythonScript2.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
在不了解使用哪个集群控制系统的情况下,很难为您提供更多帮助。