当前位置:  开发笔记 > 后端 > 正文

Ruby/Rails线程安全

如何解决《Ruby/Rails线程安全》经验,为你挑选了3个好方法。

我一直在使用Ruby进行黑客攻击,但我没有做过任何大型或多线程的事情.我听说MRI只支持绿色线程,JRuby通过JVM支持本机线程.但是,我偶然发现了对博客和讨论组的评论,他们说"Rails不是线程安全的"或者Ruby本身不是线程安全的.例如,某人评论说require语句存在问题.这听起来有点基础.

我已经看到很多Java应用程序没有正确处理并发性,我不时对它们做噩梦:-)但至少你可以用Java编写线程安全的应用程序,如果你真的知道你在做什么(它是只是不容易).

这一切听起来都非常惊人,有人可以详细说明 - 究竟是什么问题以及如果是这样的话Rails如何设法工作?我可以编写多线程的Ruby代码,它可以在没有竞争条件和死锁的情况下正常工作吗?它是否可以在JRuby和MRI之间移植,或者我是否必须破解JVM特定代码才能正确利用JVM本机线程?

编辑:

我应该问两个问题,因为人们似乎只回答了rails线程的东西(这本身很好)和绿色线程与本机线程.我对关于线程安全的核心Ruby问题的关注还没有得到解决.在某些情况下,似乎至少存在一个(未解决的?)问题.



1> Brian Guthri..:

首先,Ruby 1.9(最新的官方发行版)现在使用本机(内核)线程.以前版本的Ruby使用绿色线程.为了简单回答你的问题,在1.9之前,线程并不常用于大型或小型的Ruby应用程序,因为它们不是特别安全或可靠.

这并不特别令人担忧,因为在版本2.2之前,Rails没有尝试线程安全,因此我们通常通过使用多个进程,数据库记录锁定和Starling等消息队列来处理异步处理.这通常是一种非常可靠的扩展Web应用程序的方法 - 至少与错误的多线程Java应用程序一样可靠 - 并且具有额外的优势,即可以更轻松地将应用程序横向扩展到多个处理器和服务器.

我不知道你提到的'require'问题是否已经从1.9开始解决了,但我确实谦虚地冒昧地说,如果你在新线程中动态地需要库,那​​么你就有多个可维护性问题.

如果你想完全避免线程,Ruby 1.9 也支持光纤,它采用无共享的并发方法,从我收集的内容来看,通常比线程更容易编写和维护.这里的表现数字.



2> Marcin Urban..:

我真的建议你观看Jim Weirich在RubyConf 2008上的发言(这非常有趣且内容丰富:):

https://www.youtube.com/watch?v=fK-N_VxdW7g

这个也很好:

http://rubyconf2008.confreaks.com/summer-of-code-rails-thread-safety.html



3> Kjetil Ødega..:

MRI的常规解决方案是运行多个Rails实例,每个实例独立处理请求.由于MRI无论如何都不是多线程的,因此您无法在其上运行多个Rails实例.这意味着每次Ruby进程加载一次Rails就会占用内存.

由于JRuby支持本机线程,因此您始终可以在单个JVM中运行多个Rails实例.但是使用Rails是线程安全的,你可以将它降低到1,这意味着更低的内存使用率和更少的JIT编译.

Charles Nutter(JRuby)有一个很好的总结.

推荐阅读
云聪京初瑞子_617
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有