这可能听起来有些矛盾,但是否有一种方法可以以简单的“串行”方式运行并行,而无需加载线程池?我使用并行作为比xargs更安全、更强大/功能更强的替代方法。
我面临的问题是,在一个已经并行化的代码块内,我想按顺序处理一堆参数(实际上这些工作非常简单,我的CPU已经运行到了100%)。
我知道“-P 1”选项,但似乎即使是这样,并行也会创建一个作业池(或其他东西),这实际上会带来相当大的开销。例子:
我面临的问题是,在一个已经并行化的代码块内,我想按顺序处理一堆参数(实际上这些工作非常简单,我的CPU已经运行到了100%)。
我知道“-P 1”选项,但似乎即使是这样,并行也会创建一个作业池(或其他东西),这实际上会带来相当大的开销。例子:
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
正如您所看到的,parallel 几乎增加了 400% 的开销。当然,这个例子是微不足道的,但我的实际用例并没有比这更复杂,而且我确实利用了 parallel 的字符串替换功能。
有没有更好的方法来完成我想做的事情?我想避免使用 for-loop/xargs,因为我需要重写那些字符串替换...
(我在 bash 中使用 parallel,如果有关系的话)