和 [url=http://bot.iteye.com/]机器人[/url]就 [url=http://qichunren.iteye.com/blog/551968]在Rails中的 Model中使用current_user[/url]的问题进行了一些讨论,引发了一些想法,相关的资料杂烩一下,以便于自己和各位日后参考。
首先,Rails从2.2开始支持线程安全,这个可以参照官方2.2 release的说明
这个也很说明问题
[url=http://m.onkey.org/2008/10/23/thread-safety-for-your-rails]Thread safety for your Rails[/url]
那么,或者,我们比较初级想知道,到底线程安全啥意思,有什么好处呢那么参考下面
[url=http://blog.headius.com/2008/08/qa-what-thread-safe-rails-means.html]What Thread-safe Rails Means[/url]
或者,参考一下,非原本的解读
[quote]Ruby on Rails官方博客发布的信息,Josh Peek加入了Rails的核心开发团队。Josh Peek正在开发的一个项目是让Rails框架变成线程安全的版本,该项目参加了今年的Google Summer Of Code大赛。
DHH宣布将在Rails 2.2版本当中合并Josh Peek的关于Rails线程安全的项目工作成果,这意味者Rails下一个版本,即2.2版本将支持多线程方式运行Rails。
我们知道,截止Rails 2.1版本,Rails仍然是以单进程内单线程方式运行,如果Rails改为单进程内多线程方式运行,会带来什么好处呢?
1、节省物理内存
由于多个线程在一个进程内可以共享内存空间地址,可以节省大量物理内存空间地址。
2、可以并发响应更多请求
一个进程内多个线程的调度可以由Mongrel等支持多线程的Ruby应用服务器管理,因此可以根据请求负载,创建更多线程响应请求,提高并发处理能力
但是以多线程方式运行Rails,并非革命性的进步,多线程也会带来很多问题:
1、ruby进程的GC过程会阻塞进程内所有线程的运行,GC比多进程方式带来更大的影响
2、多线程可以共享进程内资源,可能会导致程序员滥用多线程造成多个线程资源争用问题
3、多线程内任何一个线程的问题都可能影响整个进程的稳定运行。
但是多线程的Rails对于JRuby无疑是一个天大的好消息!由于JVM本身就是支持内核多线程的,因此多线程的Rails运行在JRuby上面是一个天然的绝配,不但可以大幅度减少JRuby的内存消耗,而且可以切实有效提供JRuby的并发处理性能。
总之,Rails 2.2支持多线程将为我们打开Rails的另外一扇门。[/quote]
也就是说,作为web服务,没有多线程,我们多进程并发,不共享物理内存一直也一样用。
这里还有一段肉饼老大的论述,偷过来帮助消化
[quote="肉饼"]
[quote="amonlei "]rails2.2支持线程安全了,看了一下官方文档,发现有问题,因为rails的action与view一般都是采用实例变量进行传值的。问题出来了:
1. 如果rails的controller采用类似java的单例模式,实例变量就会相互污染
2. 如果rails采用每个请求生成一个controller实例,那这部分的线程安全意义不大了
我估计采用的是2.,这样整个rails就不用加载多个实例了,不能采用单例的根源还是因为上面说说的采用类实例变量进行传值的机制导致的,各位大牛如何看待?[/quote]
controller一向都是每个请求过来创建的,本身就是线程安全的。过去ActiveRecord是单例的,线程不安全,不过2.2改了一些底层实现,尽管现在还是单例,但是已经上线程安全的了。
不过不用多线程Rails的主要原因不在Rails框架本身,而在于Web应用本身没有必要多线程。Rails支持多线程只是给你多了一个option而已。 [/quote]
关于伪线程有[url=http://jack.iteye.com/]jack老大[/url]的讨论也不错[url=http://www.iteye.com/topic/30994]Ruby 线程[/url]
读完这些乱七八糟的东西以后,如果更晕了,那么我的目的就达到了,如果,没有呢,那我们继续探讨。 :wink:
[url=http://shiningray.cn/rails-built-in-cache-engine-and-thread-safety.html]Rails内置缓存引擎与线程安全[/url]
[quote="曹力"]
升级到Rails 2.1之后,使用Rails内置的缓存之后,发现使用mem_cache_store总是报错,于是干脆研究了Rails内置缓存引擎的代码。阅读的结果发现,Rails的内置引擎只应该应用于进程模式,尤其是mem_cache_store,因为mem_cache_store是每进程建立一个到 memcached的链接,即便是读取,也需要写入套接字,所以为了同步,必须使用锁。因此即使在读取缓存的时候,也会出现争用的情况。 mem_cache_store也必须像Rails2.2中的ActiveRecord一样实现一个到memcached的线程池,或者使用异步链接,否则是发挥不出memcached的效率的。
我研究了另外几个cache_store,
* memory_store则根本连锁机制都没有,但对应有个多线程的synchronized_memory_store,使用了Monitor;
* drb_store没有用过,可能Drb本身有一些同步机制,但估计也可能会出现与mem_cache_store一样的问题;
* file_store应该是在多线程中应该比较理想的,因为使用了文件系统自身的同步机制,使用了File.atomic_write,无论是多线程还是多进程都能共享同一个file_store。
[/quote]
[url=http://hlee.iteye.com/admin/blogs/556653]Ruby的memcache-client[/url]
到了缓存了,还没有说到 current user的问题或者,再开一头杂烩。
首先,Rails从2.2开始支持线程安全,这个可以参照官方2.2 release的说明
这个也很说明问题
[url=http://m.onkey.org/2008/10/23/thread-safety-for-your-rails]Thread safety for your Rails[/url]
那么,或者,我们比较初级想知道,到底线程安全啥意思,有什么好处呢那么参考下面
[url=http://blog.headius.com/2008/08/qa-what-thread-safe-rails-means.html]What Thread-safe Rails Means[/url]
或者,参考一下,非原本的解读
[quote]Ruby on Rails官方博客发布的信息,Josh Peek加入了Rails的核心开发团队。Josh Peek正在开发的一个项目是让Rails框架变成线程安全的版本,该项目参加了今年的Google Summer Of Code大赛。
DHH宣布将在Rails 2.2版本当中合并Josh Peek的关于Rails线程安全的项目工作成果,这意味者Rails下一个版本,即2.2版本将支持多线程方式运行Rails。
我们知道,截止Rails 2.1版本,Rails仍然是以单进程内单线程方式运行,如果Rails改为单进程内多线程方式运行,会带来什么好处呢?
1、节省物理内存
由于多个线程在一个进程内可以共享内存空间地址,可以节省大量物理内存空间地址。
2、可以并发响应更多请求
一个进程内多个线程的调度可以由Mongrel等支持多线程的Ruby应用服务器管理,因此可以根据请求负载,创建更多线程响应请求,提高并发处理能力
但是以多线程方式运行Rails,并非革命性的进步,多线程也会带来很多问题:
1、ruby进程的GC过程会阻塞进程内所有线程的运行,GC比多进程方式带来更大的影响
2、多线程可以共享进程内资源,可能会导致程序员滥用多线程造成多个线程资源争用问题
3、多线程内任何一个线程的问题都可能影响整个进程的稳定运行。
但是多线程的Rails对于JRuby无疑是一个天大的好消息!由于JVM本身就是支持内核多线程的,因此多线程的Rails运行在JRuby上面是一个天然的绝配,不但可以大幅度减少JRuby的内存消耗,而且可以切实有效提供JRuby的并发处理性能。
总之,Rails 2.2支持多线程将为我们打开Rails的另外一扇门。[/quote]
也就是说,作为web服务,没有多线程,我们多进程并发,不共享物理内存一直也一样用。
这里还有一段肉饼老大的论述,偷过来帮助消化
[quote="肉饼"]
[quote="amonlei "]rails2.2支持线程安全了,看了一下官方文档,发现有问题,因为rails的action与view一般都是采用实例变量进行传值的。问题出来了:
1. 如果rails的controller采用类似java的单例模式,实例变量就会相互污染
2. 如果rails采用每个请求生成一个controller实例,那这部分的线程安全意义不大了
我估计采用的是2.,这样整个rails就不用加载多个实例了,不能采用单例的根源还是因为上面说说的采用类实例变量进行传值的机制导致的,各位大牛如何看待?[/quote]
controller一向都是每个请求过来创建的,本身就是线程安全的。过去ActiveRecord是单例的,线程不安全,不过2.2改了一些底层实现,尽管现在还是单例,但是已经上线程安全的了。
不过不用多线程Rails的主要原因不在Rails框架本身,而在于Web应用本身没有必要多线程。Rails支持多线程只是给你多了一个option而已。 [/quote]
关于伪线程有[url=http://jack.iteye.com/]jack老大[/url]的讨论也不错[url=http://www.iteye.com/topic/30994]Ruby 线程[/url]
读完这些乱七八糟的东西以后,如果更晕了,那么我的目的就达到了,如果,没有呢,那我们继续探讨。 :wink:
[url=http://shiningray.cn/rails-built-in-cache-engine-and-thread-safety.html]Rails内置缓存引擎与线程安全[/url]
[quote="曹力"]
升级到Rails 2.1之后,使用Rails内置的缓存之后,发现使用mem_cache_store总是报错,于是干脆研究了Rails内置缓存引擎的代码。阅读的结果发现,Rails的内置引擎只应该应用于进程模式,尤其是mem_cache_store,因为mem_cache_store是每进程建立一个到 memcached的链接,即便是读取,也需要写入套接字,所以为了同步,必须使用锁。因此即使在读取缓存的时候,也会出现争用的情况。 mem_cache_store也必须像Rails2.2中的ActiveRecord一样实现一个到memcached的线程池,或者使用异步链接,否则是发挥不出memcached的效率的。
我研究了另外几个cache_store,
* memory_store则根本连锁机制都没有,但对应有个多线程的synchronized_memory_store,使用了Monitor;
* drb_store没有用过,可能Drb本身有一些同步机制,但估计也可能会出现与mem_cache_store一样的问题;
* file_store应该是在多线程中应该比较理想的,因为使用了文件系统自身的同步机制,使用了File.atomic_write,无论是多线程还是多进程都能共享同一个file_store。
[/quote]
[url=http://hlee.iteye.com/admin/blogs/556653]Ruby的memcache-client[/url]
到了缓存了,还没有说到 current user的问题或者,再开一头杂烩。