Tag: 线程安全

Thread.current 值和类级属性是否可以安全地在rails中使用?

我有一个特殊的问题,我试图在rails 3应用程序中解决,我看到的两个常见解决方案是: Thread.current[:something] = value 和 class Foo cattr_accessor :bar end Foo.bar = value 这些数据存储方法(以及相应的检索)是否安全地跨多个用户同时向我的rails应用程序发出请求? 我关心Thread.current,因为Web服务器可以使用单个线程来提供多个请求,对吧? 或者,在使用Thread.current时,rails处理线程以防止出现问题的方式是什么? 我看到Acts As Current使用Thread.current来存储当前用户,所以这给了我希望……但我想要权威的确认。 我还关注生产环境中的类级别属性,因为出于性能原因,我希望rails能够在内存中缓存类对象。 类级别属性是否可以跨请求重复使用? 或者是否因为rails在处理请求中处理类属性的问题而安全? 再次,我想对此进行权威性的确认。 …这个应用程序使用Ruby 1.9.2@p180,使用Rails 3.0.9

Rails 3 ActiveRecord .skip_callback线程安全

这段代码线程安全吗? MyModel.skip_callback(:save, :before, :my_callback) my_model_instance.update_attributes(attributes) MyModel.set_callback(:save, :before, :my_callback) 我可以安全地使用它来避免递归重新触发相同的回调吗? 这是一个例子 class Blog :active_theme_id_changed? # … private def update_blog_theme # Reuses a previously used BlogTheme or creates a new one blog_theme = BlogTheme.find_by_theme_id_and_blog_id( self.active_theme_id, self.id) blog_theme ||= BlogTheme.create!( :theme_id => active_theme_id, :blog_id => self.id ) Blog.skip_callback(:save, :after, :update_blog_theme) self.update_attributes!(:active_blog_theme_id => blog_theme.id) Blog.set_callback(:save, :after, :update_blog_theme) end end

用于跟踪Rails上的用户活动的通知系统

我正在开发一个基于事件触发器生成通知的gem。 例如,在CMS中,如果创建了文章,则将生成通知“由用户y创建的文章x”。 (像Github / Facebook通知)。 在我的gem中,我有一个has_notifications方法,当在模型中指定时,它会注册回调 。 问题当然是,当触发回调时,调用gem中的相应操作,但是此操作将需要执行该操作的用户的用户id来生成通知。 我看向acts_as_audited和paper_trail寻求灵感,但两者都使用Thread.current变量来存储用户信息,当然我认为这是hacky而且不安全 。 在基本设计方面,我做得对吗? 我还有哪些其他选项可以从我的gem中捕获用户信息? 我是否应该在相应的控制器中设置filter以创建通知,以防万一使用vanilla current_user方法? 任何想法,将不胜感激。 谢谢。 更新 我正在考虑将虚拟属性用于具有通知回调的模型,并使用之前的filter将它们设置在适当的控制器中。

在Rails中不是线程安全的东西的示例

我已经在Rails中看到了关于线程安全的线程以及关于该主题的各种网页,我确信每个人都很擅长朗读它是什么,并给出了关于什么不是线程安全的“技巧”(“类变量” !“),但我似乎永远无法找到一个清晰,简单,完整的Rails实际上不是线程安全的例子,我想知道是否有人真正了解它。 如果有人能certificate我错了并给予:我将不胜感激: 一个清晰,简单,完整的Rails中不是线程安全的东西的例子。 应该清楚代码的位置(即,如果它在控制器中,请显示它)并且不应该留给读者的想象力(例如不存在的方法)。 此外,不应该有任何多余的代码或逻辑。 确切地说,两个用户在两个不同的线程上同时连接到网站的情况下会出现问题。 如何纠正这个问题。 更重要且与Rails相关的示例越好,所以如果您可以举例说明一个用户可能会看到另一个用户的数据(或类似数据),请执行此操作。

如何异步收集在ruby中实时创建的新线程的结果

我想继续检查数据库中的表以查找要运行的命令。 某些命令可能需要4分钟才能完成,大约10秒钟。 因此我想在线程中运行它们。 因此,每条记录都会创建新线程,并在创建线程后删除记录。 因为DB查找+线程创建将在无限循环中运行,我如何从线程获取’响应’(线程将发出shell命令并获取我想要阅读的响应代码)? 我想过创建两个带有无限循环的Thread: – 首先是DB查找+创建新线程 – 第二个是…以某种方式读取线程结果并对每个响应进行操作 或者也许我应该使用fork,或者os生成一个新进程?

是|| =在Ruby线程安全吗?

不确定线程​​安全是否适用于||= 。 最初是关于ActiveSupport :: Memoizable的,并且想知道那里的线程安全性。