2

如果 Ruby 方法创建线程,但在方法中连接它们,从函数式编程的角度来看,这是否仍被视为副作用?我正在使用的实现是 YARV Ruby,其中线程由操作系统创建,尽管使用 GVL(全局 VM 锁)。

创建线程的原因是进行system调用,这无论如何都是副作用,但我从未遇到任何人说线程是否是副作用。

简化的伪代码如下所示:

  def run_tasks
    input_files = (1..4).map {|i| "input_#{i}"}
    output_files = (1..4).map {|i| "output_#{i}"}
    threads = [input_files, output_files].transpose.map |input_file, output_file|
      # system itself is a side effect
      Thread.new { system(["sub_program.rb", input_file, output_file]) }
    end
    threads.map(&:join)
  end
4

2 回答 2

1

如果线程除了接收初始参数并返回一些最终结果或使用任何其他副作用之外没有以任何方式进行通信,那么线程的使用可以被认为是纯粹的。

如果可以将“生成一个线程以运行计算 X 然后获取其结果”的代码替换为仅说“运行计算 X”的代码,除了更改运行时量之外没有任何影响,那么它就是纯粹的。如果你不能这样做,那么线程正在做一些副作用。

于 2012-10-09T10:42:22.830 回答
1

时间的流逝很少被认为是副作用,因此使用线程来减少发生的时间并不是副作用。这类似于使用记忆来提高性能,这也不是副作用,即使它修改了隐藏状态。

请注意,这input_files.zip(output_files)将与 一样好[input_files, output_files].transpose,并且可以更好地传达您的意图。

于 2012-10-08T23:38:48.107 回答