这可能听起来很矛盾,但有没有办法以简单的“串行”方式并行运行,甚至没有加载线程池?我使用parallel作为xargs的更安全,更强大/更实用的替代方案。
我面临的问题是,在已经并行'的代码片段中,我想顺序处理一堆args(这些工作实际上是微不足道的,我的CPU是已经100%运行。
我知道“-P 1”选项,但似乎即使在那时,parallel也会创建一个作业池(或者其他东西),这实际上有相当大的开销。例如:
monarch:~/tests$ time ls -1 | xargs -n 1 -d $'\n' -I{} echo {} > /dev/null
real 0m1.084s
user 0m0.073s
sys 0m1.053s
monarch:~/tests$ time ls -1 | parallel -P1 'echo {} > /dev/null'
real 0m4.903s
user 0m2.235s
sys 0m3.046s
正如您所看到的,并行处于此处近400%的开销。这个例子当然是微不足道的,但我的实际用例实际上并没有那么复杂,我做利用并行的字符串替换功能。
有什么更好的办法去做我想做的事情?我想避免for-loop / xargs,因为我必须重写那些字符串替换...
(我在bash中使用parallel,因为它值得)
答案 0 :(得分:1)
如果GNU Parallel占用核心的100%,请查看:http://www.gnu.org/software/parallel/man.html#EXAMPLE:-Speeding-up-fast-jobs
如果您不关心输出,--ungroup
也会更快。