`
hozaka
  • 浏览: 39041 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论

关于 ruby / rails 的线程模型

阅读更多

inu 的项目中有一个导入功能,将用户从浏览器、del.icio.us 导出的收藏条目导入到 inu 收藏夹中。这个功能推出以来,用户的反响并不好,其主要原因在于:速度慢,考验用户的耐心。

速度慢的问题,根本原因在于 model 层需要做的工作非常多,也是目前不完善的架构以及比较特殊的需求导致的,可以说不能从根本上解决。每次导入一条记录,都需要更新好几个表,本身 ruby 在目前虚拟机下效率并不高,所以导入的速度并不理想。

那么,退而求其次,可以设置一个直观的进度条来告诉用户目前导入的进度,可以在很大程度上缓解用户的焦虑、不信任的心理。

解决方案是确定了,可是问题由此而来:ruby 是单线程的。

严格来说,应该是目前的虚拟机还不支持真正多线程的 ruby 应用。虽然 ruby 中确实有 Thread 类 ,但是查阅相关文档可以知道,这个类是一个伪 Thread,不同于真正的多线程。如果通过 join 将子线程挂到当前的主线程中(某个 mongrel 进程),那么该线程在结束之前会等待所有的子线程结束。通常情况下这种机制可以模拟出和其他语言相类似的线程模型。但是在 rails 中,有新的问题产生:无论是 FastCGI 还是 Mongrel ,都是一个请求独占一个进程,每次请求都会创建新的 Controller 实例,请求结束后该实例销毁。也就是说,在 Controller 内无论是不使用线程、或是把子线程挂到主线程上,在所有操作结束之前,当前进程一直处于 block 状态。

很可怕!

通常用 thread 是在不影响主线程的情况下处理耗时很多的操作。但是这种机制明显不能应付这种需求。一台服务器上 mongrel 数量有限,都被阻塞了,相当于服务器在这段时间内不能接收其他的请求。

那么是否让 thread 单独执行就可以了呢?答案也是否定的。在单独的线程中,Model 类将不再是 Model。其实意思是:线程中的 ActiveRecord 类不再具有标表间关联(目前我测试出来就这么多,可能还会失去更多东西),只是一个普通的实体类。对于这样的导入,无疑就是毁灭性的。

至此,可以确定,这个应用不可避免的要阻塞一个 mongrel 了。那么如果要反应当前导入的进度,就是要发起一个新的请求,查询导入状态。如果这个请求发送到 rails ,意味着用户的导入要占用 2 个 mongrel ,服务器不可能有这么多的资源。

最终我采取了一种折中的方案,导入时创建一个可访问的静态资源,查询进度的功能由这个静态资源来完成,而 web 应用对于静态资源的访问则由 apache 来完成。

至此,问题算是解决了,虽然算不上完美。期望 ruby 的虚拟机能够尽快支持 multi-thread 吧!

分享到:
评论

相关推荐

    Ruby - Ruby for Rails

    - **性能优化**:分享一些关于如何提高 Ruby 和 Rails 应用程序性能的方法。 ### 二、Ruby 建筑模块 #### 2.1 对象与变量 - **对象概念**:深入理解 Ruby 中的对象概念,包括对象的身份、状态和行为。 - **变量...

    rails2-sample

    从给定的文件信息来看,我们正在探讨的是一本关于Ruby on Rails的书籍,书名为《Simply Rails2》,作者是Patrick Lenz。本书旨在为初学者提供深入理解Ruby on Rails框架的指南,从基础概念到高级主题均有涵盖,是...

    Wrox.Professional.Ruby.on.Rails.Feb.2008

    《Wrox Professional Ruby on Rails Feb 2008》是一本专门为想要深入理解Ruby on Rails框架的开发者编写的书籍。Ruby on Rails(简称RoR)是基于Ruby编程语言的开源Web应用框架,它遵循“Don't Repeat Yourself”...

    jRuby On Rails WEB2.0

    Ruby on Rails(简称RoR或Rails)是一个用于web开发的模型-视图-控制器(MVC)框架,用Ruby语言编写。Rails强调“约定优于配置”(Convention Over Configuration,CoC)的原则,大大简化了Web应用的开发过程,使得...

    Ruby-極光Rails5專屬伺服器安裝包

    Passenger 5支持多进程和多线程模型,可以有效地管理Rails应用的实例,提高并发处理能力。它还简化了部署流程,允许开发者通过简单配置就能将应用集成到Nginx或Apache中。 3. **Nginx 1.10**: Nginx是一款高性能的...

    Working with Ruby Threads

    然而,随着应用程序规模的扩大和复杂性的增加,传统的单线程模型越来越难以满足高并发处理的需求。因此,理解和掌握Ruby中的线程技术变得尤为重要。 #### 多线程编程的承诺 多线程编程能够显著提高程序的执行效率...

    线程与并发:Ruby并行世界的探索之旅

    理解线程、并发模型以及同步机制对于编写高效、稳定的 Ruby 程序至关重要。 #### 展望未来 随着 Ruby 解释器的持续发展以及并发模型的不断完善,预计 Ruby 将能够提供更加强大的并发能力,使开发者更好地利用多核...

    RUBY语言入门教程

    - **线程与并发**:RUBY支持多线程编程,但对于CPU密集型任务可能需要考虑使用进程或其他并发模型。 - **性能优化**:了解JIT编译器、内存管理等方面的知识,提高程序执行效率。 #### 六、资源推荐 - **官方文档**...

    rails 部署 nginx

    标题 "rails 部署 nginx" 涉及到的是在Web开发中使用Ruby on Rails框架结合Nginx服务器进行应用部署的相关知识。Nginx以其高性能、稳定性以及反向代理和负载均衡能力,常被用作Rails应用的前端服务器。下面将详细...

    Ruby-Puma一个Ruby的并发Web服务器

    1. **并发模型**:Puma使用多线程模型处理请求,这使得它能够在单个进程中并发地服务多个连接。它通过避免线程切换开销,实现了更高的效率。Puma还支持工作进程模式,即通过创建多个进程来分散负载,提高系统的整体...

    jruby_on_rails

    Ruby on Rails(简称 Rails)是由 David Heinemeier Hansson 创建的,它是一个全栈的 web 开发框架,以其“约定优于配置”(Convention over Configuration)的理念和“模型-视图-控制器”(MVC)架构模式而闻名。...

    ruby中文文档

    5. **GIL(全局解释器锁)**:虽然Ruby的多线程模型受到全局解释器锁的限制,意味着在单个CPU核心上,同一时刻只能有一个线程执行Ruby代码,但仍然可以在IO密集型任务中利用多核资源。 6. **标准库和Gem**:Ruby的...

    ruby语言帮助文档(简体中文)

    8. **Rails框架**:Ruby最有名的框架是Ruby on Rails,它是一个用于开发Web应用的全栈框架,遵循MVC(模型-视图-控制器)架构模式。Rails提供了一套强大的工具和约定,简化了Web开发过程。 9. **异常处理**:Ruby...

    Ruby 技术手册(CHM 电子版)

    《Ruby技术手册》是一部关于Ruby编程语言的权威指南,以CHM(Microsoft Compiled HTML Help)格式呈现,方便读者查阅和学习。Ruby是一种面向对象、动态类型的脚本语言,以其简洁的语法、强大的元编程能力以及对...

    Rails相关电子书汇总二

    Ruby on Rails(简称Rails)是一种基于Ruby语言的开源Web应用程序框架,它遵循MVC(模型-视图-控制器)架构模式,以简洁、高效的代码和“约定优于配置”的哲学著称。 在描述中提到了"博文链接:...

    ruby-aws-cookbooks:AWS OpsWorks 上的 Ruby on Rails + Sidekiq + Elasticsearch + Capistrano 说明书

    首先,Ruby on Rails是Web开发中的一个流行框架,它基于模型-视图-控制器(MVC)架构模式,使得构建数据库驱动的Web应用变得更加容易。在AWS OpsWorks上部署Rails应用,可以利用其自动化的基础设施管理功能,包括...

    Ruby 语言基础(入门推荐)

    Ruby在Web开发中的应用主要体现在Ruby on Rails框架上,这是一个基于MVC(模型-视图-控制器)架构模式的开源Web应用框架,极大地简化了Web应用的开发流程。Rails的"约定优于配置"(Convention over Configuration)...

Global site tag (gtag.js) - Google Analytics