Lis*_*yen 5 bash zsh shell-script multi-core
如果我想使用只能使用一个内核的命令“do_something”处理大量文件,假设每个文件都可以独立处理,那么使用所有可用内核的最佳方法是什么?
此刻我做这样的事情:
#!/bin/zsh
TASK_LIMIT=8
TASKS=0
for i in *(.)
{
do_something "$i"&
TASKS=$(($TASKS+1))
if [[ $TASKS -ge $TASK_LIMIT ]]; then
wait; TASKS=0; fi
}
wait
Run Code Online (Sandbox Code Playgroud)
显然,这效率不高,因为在达到 $TASK_LIMIT 后,它会等待所有“do_something”完成。例如,在我的真实脚本中,我使用了大约 500% 的 8 核 CPU,而不是 >700%。
不使用 $TASK_LIMIT 运行不是一种选择,因为“do_something”可能会消耗大量内存。
理想情况下,脚本应该尝试将并行任务的数量保持在 $TASK_LIMIT:例如,如果 8 个任务中的第 1 个完成并且至少还有一个文件要处理,则脚本应该在下一个“do_something”运行而不是等待剩余的 7 个任务完成。有没有办法在 zsh 或 bash 中实现这一点?
归档时间: |
|
查看次数: |
4841 次 |
最近记录: |