ruby - 从 FP 的角度来看,在 YARV Ruby 中创建线程通常被视为副作用吗?

标签 ruby multithreading functional-programming side-effects

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

创建线程的原因是为了执行系统调用,无论如何这都是副作用,但我从未遇到过有人说线程是否是副作用。

简化的伪代码如下所示:

  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

最佳答案

The passage of time is seldom considered a side-effect ,因此使用线程来减少发生时间并不是副作用。这类似于使用内存来提高性能,尽管它修改了隐藏状态,但这也不是副作用。

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

关于ruby - 从 FP 的角度来看,在 YARV Ruby 中创建线程通常被视为副作用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12790815/

相关文章:

ruby-on-rails - Ruby on Rails - 读取和评估参数哈希

ruby 线程输出

function - 如何在 Haskell 的树之间移动子树?

reactjs - 功能组件嵌套 vs. props

haskell - 如何定义该函数的类型配置文件?

ruby-on-rails - 尝试创建新记录时为"no implicit conversion of Symbol into String"

python - 为什么 Ruby 有 Rails 而 Python 没有中央框架?

ruby - 我安装的 Koala 有什么问题?

c# - 一个在读取输入时进行计算的窗口窗体应用程序

c# - 线程安全共享对象过期和重新初始化