重新设计这个并行伪代码更干

时间:2012-05-29 08:06:58

标签: ruby parallel-processing

我想到的设计问题看起来并不复杂,但我自己找不到解决问题的方法。我想尽可能地遵循DRY原则。

我有两个功能。一个是算法的基本版本,另一个是并行编程的改进。它们是两个,我的目标是只用其他参数写出其中一个参数,例如" parallel"。这里是伪代码。

fun1 ()
    loop for par1 times
        do_work()

fun2 ()
    loop for par1 times
        run new thread
            do_work()

目前我已编码

if parallel == 0
    fun1 ()
else
    fun2 ()

我想要的是像

fun ()
    loop for par1 times
        run new thread if parallel > 0 #Ruby's syntax-like
            do_work()

我想知道Ruby是否可以帮我解决这个问题。我是Ruby的新手,所以我不确定它的函数式编程能否带来不同。

1 个答案:

答案 0 :(得分:1)

就像这样:

def fun(parallel=false)
  if parallel
    # called as fun(true)
  else
    # called as fun
  end
end
如果没有传递参数,

parallel=false设置默认参数值。

或者您可以使用选项哈希来更明确地传递参数

def fun(options={})
  parallel = option[:parallel] || false
  if parallel
    # called as fun(parallel: true)
  else
    # called as fun
  end
end

另一种方法是始终在线程中运行do_work()并等待线程完成,具体取决于parallel参数。

def fun(parallel=false)
  workers = []
  par1.times do
    worker = Thread.new { do_work() }
    worker.join if parallel
    workers << worker
  end
  workers.each(&:join)
end