【发布时间】:2014-09-30 19:50:27
【问题描述】:
我正在编写一个从命令行获取一系列参数的脚本
script.pl start end
for ($k1=$start; $k1<$end; $k1 += 0.001) {
for ($k2=$start; $k2<$end; $k2 += 0.01) {
for ($k3=$start; $k3<$end; $k3 += 0.001) {
for ($k4=$start; $k4<$end; $k4 += 0.001) {
for ($k5=$start; $k5<$end; $k5 += 0.001) {
...
}}}}}
如果我将参数设置在0到1之间,需要很长时间。最简单的方法是将它们分成更小的间隔,例如
script.pl 0 0.01
script.pl 0.01 0.02
...
script.pl 0.9 1
那我要同时开100屏!!
有人可以指导我如何自动完成吗?
我不确定什么是最好的方法,因此我问。我有 256 个内核。
【问题讨论】:
-
在同一台机器上一次打开 100 个屏幕并在它们上运行 100 个不同的脚本不会并行化任何事情。如果您的机器有 2 个内核,操作系统可能会在内核 1 上分配前 50 个脚本,在内核 2 上分配接下来的 50 个脚本
-
您实际上想要完成什么?这看起来像很多嵌套迭代......但这并没有做任何事情。无论如何,perl 支持线程和分叉来执行并行代码。哪个最合适很大程度上取决于您要完成的工作。
-
你有没有尝试过?您是否研究过用于跨内核分配工作的 perl 方法?鉴于您如何拆分它们的示例,解决方案是否不会呈现给您?是否提醒您可以使用
&从 shell 在后台运行脚本有帮助? -
@arunmoezhi 这完全是并行化的。你甚至在评论中说了这么多。目前,据推测,他的脚本连续运行(并且在一个内核上运行,除非他显式或隐式地使用 perl 线程支持)。拆分它,如果存在的话,他保证能够使用多个核心(你自己也说过)。
-
我想指出,打开 100 个屏幕并不能完成任何事情,而且并行化事情是一种痛苦的方式。正如您所说,使用 '&' 并在后台运行它会是一个更好的选择。如果脚本要运行很长时间,添加“nohup”也会很有用。