如何在bash中并行化while循环?

如何在bash中并行化while循环?,bash,parallel-processing,Bash,Parallel Processing,我有以下并行运行的while循环。(logProcess是我之前在脚本中定义的一个函数。) 读行时;做 logProcess$行& 完成我可以向您推荐GNU Parallel。您的整个脚本将变成: parallel -a "$ELS_LOGS" logProcess 如果logProcess是脚本中定义的函数,则需要在运行GNU Parallel之前首先导出它,如下所示: export -f logProcess 然后,如果您想一次运行8次,只需执行以下操作: parallel -j 8 -

我有以下并行运行的
while
循环。(logProcess是我之前在脚本中定义的一个函数。)

读行时
;做
logProcess$行&

完成我可以向您推荐GNU Parallel。您的整个脚本将变成:

parallel -a "$ELS_LOGS" logProcess
如果
logProcess
是脚本中定义的函数,则需要在运行GNU Parallel之前首先导出它,如下所示:

export -f logProcess
然后,如果您想一次运行8次,只需执行以下操作:

parallel -j 8 -a "$ELS_LOGS" logProcess
如果您想看看它会做什么,而不实际做任何事情:

parallel --dry-run ...
如果您想要进度条或ETA:

parallel --eta ...
parallel --bar ...

GNU
xargs
也是一个适合该作业的工具:

xargs -P 20 -d $'\n' -n 1 logProcess

…将运行多达20个并发的
logProcess
实例,将stdin的每一行赋给
xargs
传递给不同的实例。

可能在循环内部,您可以检查ps-ef和grep日志进程,并检查行数[wc-l]。如果这超过了要运行的进程数,则可以休眠一段时间,直到其中一个进程完成,然后再次启动新的logProcess。这是必需的吗?
logProcess$LINE
,而不是
logProcess“$LINE”
?请记住,如果您有一行包含
*
,您将在命令行中获得一个文件名列表。脚本包含更多函数,无法按上述方式运行。理想情况下,我需要将循环部分并行化。我不确定我是否理解-我的建议与您要求的完全相同。你的问题不能代表你想要什么吗?@MatthewBullock,如果你的函数调用其他函数,那么也导出其他函数。相比之下,如果您的函数需要修改全局共享状态,那么您就有一个无法在shell中完成的任务(不使用磁盘或其他外部存储进行协调):shell不支持线程(其中您有多个共享相同变量状态的执行行);相反,它的所有选项都是多处理风格,其中每个子流程都有自己的变量、工作目录等。
xargs -P 20 -d $'\n' -n 1 logProcess