gpt4 book ai didi

ruby - 是否可以确保线程代码在 Ruby 中没有副作用?

转载 作者:太空宇宙 更新时间:2023-11-03 16:56:32 24 4
gpt4 key购买 nike

Data safety and GIL removal提到如果您没有安装 Giant Interpreter Lock,则会增加出现竞争条件的风险。博客文章给出了以下示例:

# As noted in the blog post, this'll work correctly in MRI Ruby (1.8 or 1.9)
# but may or may not work correctly in Rubinius 2.0 or JRuby
@array, threads = [], []
4.times do
threads << Thread.new { (1..100_000).each {|n| @array << n} }
end
threads.each{|t| t.join }
puts @array.size

我要使代码线程安全的一种方法是进行函数式编程,不要让线程内的代码修改不是在线程内创建的对象/变量:

threads = 4.times.map do
Thread.new do
sub_array = []
# Modifying sub_array is fine, because it was created by this thread
(1..100_000).each {|n| sub_array << n}
sub_array
end
end
puts threads.map(&:value).flatten(1).size
# Or (and don't forget nil!)
# array = threads.map(&:value).flatten(1) ; nil
# puts array.size

是否可以指定一个线程不允许修改不“属于”它的对象/变量,如果这样做则引发警告或异常?

假设线程代码没有做任何像调用 ObjectSpace.each_object 这样异常病态的事情。

最佳答案

我不知道有什么方法可以限制 Ruby 以任何身份访问事物,除了派生出一个独立的新进程的长期传统之外。大多数语言都是这样,只有极少数异常(exception),正如您所指出的那样,严格的函数式语言属于该集合。

这里最负责任的方法是使用互斥锁定,或者通过保持数据隔离和独立来创建线程安全的类。这需要仔细设计,但如果设计得当,您的线程应用程序几乎与标准应用程序一样简单。

关于ruby - 是否可以确保线程代码在 Ruby 中没有副作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7882896/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com