2

Rubyメソッドがスレッドを作成するが、メソッド内でそれらを結合する場合でも、関数型プログラミングの観点からは副作用と見なされますか?私が使用している実装はYARVRubyで、GVL(Global VM Lock)を使用していても、オペレーティングシステムによってスレッドが作成されます。

スレッドが作成される理由は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

時間の経過が副作用と見なされることはめったにないため、スレッドを使用して時間を短縮することは副作用ではありません。これは、パフォーマンスを向上させるためのメモ化の使用に類似しています。これは、非表示の状態を変更しても、副作用ではありません。

input_files.zip(output_files)と同様に機能し[input_files, output_files].transpose、意図をより適切に伝える可能性があることに注意してください。

于 2012-10-08T23:38:48.107 に答える
1

スレッドが初期パラメーターを受け取って最終結果を返す以外の方法で通信していない場合、またはその他の副作用を使用している場合は、スレッドの使用は純粋であると見なすことができます。

「スレッドを生成して計算Xを実行し、その結果を取得する」というコードを、実行時間の量を変更する以外の効果なしに、単に「計算Xを実行する」というコードに置き換えることができれば、それは純粋です。それができない場合は、スレッドが副作用を起こしていることになります。

于 2012-10-09T10:42:22.830 に答える