【发布时间】: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