【问题标题】:Thread Safe instance variables in Ruby MRIRuby MRI 中的线程安全实例变量
【发布时间】:2014-06-06 05:57:48
【问题描述】:

我已经搜索了其他 Stack Overflow 帖子并在其他地方进行了研究,并且我对线程很熟悉,我只需要对这个特定情况进行一些说明,因为原生 ruby​​ 线程不是我的并行线程我以前在 jruby 中使用过,我对绿色线程的理解不如对 OS 级线程的理解。

鉴于标准:

  • 我需要在类实例中启动邮件程序。
  • 邮件程序需要访问存储在实例属性中的数据。
  • 我不关心线程是否成功。
  • 我不希望线程成功或失败中断我的主线程。

哪个更好?

我应该直接引用原始实例变量,还是应该克隆那个实例变量?

这可行,但我担心@foo 可能会在线程完成之前丢失:

@foo = { bar: "baz" }
Thread.new { Mailer.notice(@foo).deliver }

想知道我是否应该这样做:

@foo = { bar: "baz" }
Thread.new { Mailer.notice(@foo.freeze.clone).deliver }

回复

以引用的例子或文章的形式将不胜感激。如果有人有时间写这样的例子,真正的测试会更有价值!

【问题讨论】:

  • 什么意思,它们不是真正的线程?他们是。
  • 真正的线程,我的意思是并行
  • @foo 中的对象不会“丢失” 作为方法的参数提供 - 结果对象和 not变量是相关的。假设评估@foo 产生的对象是immutable,那么两个代码sn-ps 都有完全相同的问题——也就是说@foo 可能是在线程运行之前重新分配
  • @user2864740: ruby​​ 线程从 1.9 开始就不是绿色的
  • 像在 JRuby 中一样处理线程,你会没事的。不管它们是否真正并行运行,它们确实是同时运行的,这为竞争条件和不需要的更改提供了足够的空间。 MRI 中非并行线程的可能切换点在每个方法调用或表达式之间(有少数例外)。

标签: ruby multithreading


【解决方案1】:

答案是要么。由于我使用 >1.9,线程不是绿色的,从生命周期的角度来看,这两种方法都是相同的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-20
    • 1970-01-01
    • 2012-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多