如果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发布于 2012-10-09 07:38:48
The passage of time is seldom considered a side-effect,所以使用线程来减少发生的时间不是一个副作用。这类似于使用memoization来提高性能,这也不是副作用,即使它修改了隐藏状态。
请注意,input_files.zip(output_files)将和[input_files, output_files].transpose一样工作,并且可以更好地传达您的意图。
发布于 2012-10-09 18:42:23
如果线程除了接收初始参数和返回一些最终结果之外,没有以任何方式通信,或者使用任何其他副作用,那么线程的使用可以被认为是纯粹的。
如果可以用简单地说“运行计算X”的代码替换“产生一个线程来运行计算X,然后得到它的结果”的代码,除了改变运行时的数量之外没有其他效果,那么它就是纯粹的。如果你不能做到这一点,那么线程正在做一些副作用的事情。
https://stackoverflow.com/questions/12790815
复制相似问题