可以使用多线程并行运行100个perl脚本吗?

时间:2013-11-12 12:25:42

标签: multithreading performance perl fork command-line-interface

这是我的问题:

我有100个perl脚本随着时间的推移而创建;每个脚本都需要自己的时间 - 从5分钟到5个小时。

今天我以顺序方式从命令提示符运行所有这些脚本作为套件,运行所有脚本需要大约1.5天。

我想知道是否可以同时打开100个命令提示,如果我可以在每个命令提示符上并行运行一个perl脚本...所以我的所有脚本都可以在5个小时内完成(单个脚本占用的最长时间)

这可以通过任何工具实现吗?

我们可以使用多线程来实现上述目标吗?

请建议什么是更好的appraoch方式?

3 个答案:

答案 0 :(得分:4)

而不是:

perl script1
perl script2
...
perl script100

你可以做到

perl script1 &
perl scipt2 &
 ...
perl script100       # no & here!

但这并不完全是多线程的。

如果您拥有所有脚本,并且只有专用目录中的那些脚本(例如parscripts),则可以执行以下操作:

for s in parscripts/*.pl;do perl $s & ;done
wait
echo "All scripts completed."

但是,这当然预先假定脚本是独立的!另见@KlasLindbäcks回答。

答案 1 :(得分:2)

并行启动脚本很容易。

在Linux / Unix中,只需在每个命令的末尾添加一个&符,即可在后台启动它。

示例:

myscript &

你需要注意两件事:

某些脚本可能彼此存在依赖关系,因此在其他脚本完成之前不应启动它们。

由于多个脚本并行运行时存在瓶颈,因此总时间可能超过5小时。

第一个问题是通过组依赖脚本解决到脚本文件中,您的启动脚本可能如下所示:

#!/bin/sh
perl script1 &
perl script2 &
script_group1 &
script_group2 &
...

脚本组的位置如下:

#!/bin/sh
# Note that there is no '&' at the end of these lines,
# because they need to run consecutively:
perl dependentscript1 
perl dependentscript2
perl dependentscript3 

答案 2 :(得分:2)

如果需要定期运行这些多个脚本,则应考虑编写一个调用它们的shell脚本。或者,我们可以编写一个makefile。

当各种脚本之间存在依赖关系时,应该使用makefile,并且需要表达“ foo需要在bar 之前运行”。然后make程序将自动找到满足这些依赖关系的正确顺序。您还可以指定make将启动多少并行作业:make -j 4,用于四个并行作业。

makefile由包含依赖项和正文的收件人组成。在正文中,每一行都被视为shell命令。该命令将打印到终端,然后执行。要禁止打印,请在命令前添加@前缀。例如:

foo: bar something_else
<tab    >@ echo "I am about to execute the foo command:"
<tab    >perl /some/path/foo.pl

bar:
<tab    >@ echo "I am about to execute the bar:"
<tab    >perl /some/path/bar.pl

something_else
<tab    >perl /some/path/something.pl | perl /some/path/else.pl >/some/path/output.txt

必须将<tab >更改为文字制表符。空白的意图不起作用。

此解决方案的缺点是makefile是简单shell脚本的三倍。优点是您可以直接指定所需的并行作业数量(这样可以在没有太多空闲的情况下提供均匀负载),并且您不必手动订购脚本,例如他的答案中提出的KlasLindbäck 。使用make,您只需指定实际的依赖项。