让我说我有一个循环bash:
for foo in `some-command` do do-something $foo done
do-something是cpu绑定,我有一个很好的闪亮的4核处理器。我想能够立即运行多达4个do-something。
天真的方法似乎是:
for foo in `some-command` do do-something $foo & done
这将立即运行所有do-somethings,但有一对夫妇的缺点,主要是做某事,也可能有一些重要的I / O,执行一次可能会放慢一点。另一个问题是这个代码块立即返回,所以没有办法做其他工作,当所有的do-somethings完成。
你怎么写这个循环,所以总是有X做某事一次运行?
根据你想做什么xargs也可以帮助(这里:转换文档与pdf2ps):
cpus=$( ls -d /sys/devices/system/cpu/cpu[[:digit:]]* | wc -w ) find . -name \*.pdf | xargs --max-args=1 --max-procs=$cpus pdf2ps
从文档:
--max-procs=max-procs -P max-procs Run up to max-procs processes at a time; the default is 1. If max-procs is 0,xargs will run as many processes as possible at a time. Use the -n option with -P; otherwise chances are that only one exec will be done.