我一直在使用Ruby进行黑客攻击,但我没有做过任何大型或多线程的事情.我听说MRI只支持绿色线程,JRuby通过JVM支持本机线程.但是,我偶然发现了对博客和讨论组的评论,他们说"Rails不是线程安全的"或者Ruby本身不是线程安全的.例如,某人评论说require语句存在问题.这听起来有点基础.
我已经看到很多Java应用程序没有正确处理并发性,我不时对它们做噩梦:-)但至少你可以用Java编写线程安全的应用程序,如果你真的知道你在做什么(它是只是不容易).
这一切听起来都非常惊人,有人可以详细说明 - 究竟是什么问题以及如果是这样的话Rails如何设法工作?我可以编写多线程的Ruby代码,它可以在没有竞争条件和死锁的情况下正常工作吗?它是否可以在JRuby和MRI之间移植,或者我是否必须破解JVM特定代码才能正确利用JVM本机线程?
编辑:
我应该问两个问题,因为人们似乎只回答了rails线程的东西(这本身很好)和绿色线程与本机线程.我对关于线程安全的核心Ruby问题的关注还没有得到解决.在某些情况下,似乎至少存在一个(未解决的?)问题.
首先,Ruby 1.9(最新的官方发行版)现在使用本机(内核)线程.以前版本的Ruby使用绿色线程.为了简单回答你的问题,在1.9之前,线程并不常用于大型或小型的Ruby应用程序,因为它们不是特别安全或可靠.
这并不特别令人担忧,因为在版本2.2之前,Rails没有尝试线程安全,因此我们通常通过使用多个进程,数据库记录锁定和Starling等消息队列来处理异步处理.这通常是一种非常可靠的扩展Web应用程序的方法 - 至少与错误的多线程Java应用程序一样可靠 - 并且具有额外的优势,即可以更轻松地将应用程序横向扩展到多个处理器和服务器.
我不知道你提到的'require'问题是否已经从1.9开始解决了,但我确实谦虚地冒昧地说,如果你在新线程中动态地需要库,那么你就有多个可维护性问题.
如果你想完全避免线程,Ruby 1.9 也支持光纤,它采用无共享的并发方法,从我收集的内容来看,通常比线程更容易编写和维护.这里的表现数字.
我真的建议你观看Jim Weirich在RubyConf 2008上的发言(这非常有趣且内容丰富:):
https://www.youtube.com/watch?v=fK-N_VxdW7g
这个也很好:
http://rubyconf2008.confreaks.com/summer-of-code-rails-thread-safety.html
MRI的常规解决方案是运行多个Rails实例,每个实例独立处理请求.由于MRI无论如何都不是多线程的,因此您无法在其上运行多个Rails实例.这意味着每次Ruby进程加载一次Rails就会占用内存.
由于JRuby支持本机线程,因此您始终可以在单个JVM中运行多个Rails实例.但是使用Rails是线程安全的,你可以将它降低到1,这意味着更低的内存使用率和更少的JIT编译.
Charles Nutter(JRuby)有一个很好的总结.