Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops 在代码没有实质性更改的情况下,在脚本over循环(foreach行)中进行伪并行化_Loops_Parallel Processing_Csh_Gnu Parallel - Fatal编程技术网

Loops 在代码没有实质性更改的情况下,在脚本over循环(foreach行)中进行伪并行化

Loops 在代码没有实质性更改的情况下,在脚本over循环(foreach行)中进行伪并行化,loops,parallel-processing,csh,gnu-parallel,Loops,Parallel Processing,Csh,Gnu Parallel,我是GNU Parallel的新手,如果您指出一些错误和误解,我将非常高兴。我阅读了手册,但它基本上是关于一个阶段的操作,在这个阶段中,有必要在语法GNU Parallel(解包、移动等)中指定“操作”的定义,当您需要执行一些操作而不改变(显著地)代码时,没有任何关于多阶段步骤的规定(如果课程有可能的话) 是否有可能在不支持并行处理的代码中“伪造”并行处理? 代码有一个循环(包含任何格式的文件列表,在某一点上会循环),并且您需要该代码来同时而不是顺序地对所有文件执行某些操作(无论什么类型的操作)

我是GNU Parallel的新手,如果您指出一些错误和误解,我将非常高兴。我阅读了手册,但它基本上是关于一个阶段的操作,在这个阶段中,有必要在语法GNU Parallel(解包、移动等)中指定“操作”的定义,当您需要执行一些操作而不改变(显著地)代码时,没有任何关于多阶段步骤的规定(如果课程有可能的话)

是否有可能在不支持并行处理的代码中“伪造”并行处理? 代码有一个循环(包含任何格式的文件列表,在某一点上会循环),并且您需要该代码来同时而不是顺序地对所有文件执行某些操作(无论什么类型的操作)(无需对代码进行实质性更改或仅在138行左右-见下文)。这种并行处理不需要分割文件或类似的东西,而只需要一次处理所有文件

例如:这里有一部分感兴趣的代码,完整的代码-138行

源代码,完整代码:

也许可以使用GNU并行之外的其他工具来实现它?任何帮助都是有用的。例如,如果有的话,这是可取的。如果您使所有代码都并行,这可能会导致问题。这在循环时是必要的


感谢您,csh有很多限制;缺少功能是其中之一,任何超过几行的脚本都会很快变成一团乱麻。这就是为什么通常不鼓励使用csh编写脚本的一个重要原因

也就是说,修改它的最简单方法是将循环体提取到单独的脚本中,并使用附加的
&
调用该脚本。例如:

main.csh

#!/bin/csh

foreach line (`awk '{print $0}' $1`)
    ./loop.csh "$line" &
end
#!/bin/csh

set line = "$1"
echo "=> $line"
sleep 5
loop.csh

#!/bin/csh

foreach line (`awk '{print $0}' $1`)
    ./loop.csh "$line" &
end
#!/bin/csh

set line = "$1"
echo "=> $line"
sleep 5
您可能需要添加更多的参数,而不仅仅是
$line
;我没有检查整个脚本

&
将使shell继续运行,而无需等待命令完成。因此,如果有5000行,您将同时运行5000个进程。要对同时运行的进程数进行某种控制,您可以使用并行工具而不是循环:

#!/bin/csh

awk '{print $0}' $1 | parallel ./loop.csh`
或者,如果您想坚持使用循环,您可以使用
pgrep
来限制同步进程的最大数量:

foreach line (a b c d e f g h i)
    set numprocs = `pgrep -c loop.csh`
    if ( $numprocs > 2 ) then
        sleep 2
        continue
    endif

    ./loop.csh "$line" &
end

如果可以将循环的内部部分移动到脚本中:

parallel inner.csh ::: a b c d e f g h i
如果
internal.csh
使用变量,则在运行
parallel
之前
setenv
使用变量:

setenv myvar myval
parallel inner.csh ::: a b c
a、b和c
将作为第一个参数传递给
inner.csh
。要从文件中读取参数,请使用:

cat file | parallel inner.csh
这也适用于从
awk
读取输出:

awk ... | parallel ...

考虑浏览教程。你的命令行会喜欢你的:

有什么理由使用
csh
而不是
bash
?你似乎花了整个脚本来运行许多
awk
调用,这在
bash
中是完全不必要的。你也可以将所有代码放在
函数中n
如果您使用
bash
,那么
将该函数导出到GNU Parallel,并与
Parallel someFunc
并行运行该函数。此外,尽量避免像
grep XYZ someFile | awk'print$3'
这样的事情,而让
awk
也像这样执行搜索
awk'/XYZ/{print$3}'someFile
bash
中重写所有内容将非常困难。而且代码不是我的。特别是因为我还在学习。有很多陷阱等等。但是我问开发人员(我可以重写到bash吗)。谢谢你的想法。非常感谢!我会尝试。你能告诉我如何处理这些变量吗?我知道如果它们在循环之前设置,然后在循环中使用,GNU Parallel将启动与它们无关的新进程。代码将不起作用。任何提示都是有用的。谢谢你的帮助。我将使用应该使用文件名吗?