`
hozaka
  • 浏览: 38244 次
  • 性别: 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 吧!

分享到:
评论

相关推荐

    collaborate:使用Ruby on Rails克隆流行的项目管理应用程序“ Basecamp”

    带有主题和子主题的讨论线程 能够添加附件(文本和图像文件) 每个项目的待办事项列表以及任务和子任务-单击齿轮可让您编辑任务/子任务 锚链接显示项目页面的不同部分 我的具体贡献包括: 创建应用程序和数据库的...

    simple_discussion:一个简单的,可扩展的Rails论坛

    SimpleDiscussion-Ruby on Rails的论坛引擎 SimpleDiscussion是一个Rails论坛的瑰宝,它提取了。 它包括类别,简单审核,将线程标记为已解决的功能等。 开箱即用的SimpleDiscussion带有Bootstrap v4的样式,但是您...

    koa-logs-full:仿照rails风格的轻量log库,可以按rails的log风格记录请求日志。可以很好的解决nodejs由于单进程导致的日志串起来的问题

    nodejs是单进程单线程模型,跟php,ruby这些不同,nodejs所有的请求都会是同一个线程处理。于是会发生这种情况,第一个请求执行了一半的时候,下一个请求已经过来了。如果我们使用传统的打日志的方法。可能a请求打了...

    acts_as_commentable_with_threading:类似于acts_as_commentable; 然而,利用 awesome_nested_set 提供线程评论

    允许将线程注释添加到多个不同的模型。 与acts_as_commentable 兼容(但需要更改数据库架构) 要求 此 gem 的 2.x 版本仅适用于 Rails 4 及更高版本。 对于此 gem 的 Rails 3.x 兼容版本,请使用版本 1.2.0。 这个...

    closure_tree:轻松有效地使您的ActiveRecord模型支持层次结构

    Closure_tree让您的ActiveRecord模型充当节点 常见的应用程序包括对分层数据进行建模,例如标签,线程注释,CMS中的页面图以及跟踪用户引用。 大大低于更好的性能和 ,甚至超过真棒 ,closure_tree有一些伟大的特点...

    一款基于python语言的Web开发框架+源代码+文档说明

    1. Ruby不再需要新的WEB开发框架,Rails统治了一切。 2. PHP没有多线程,对于后台数据处理有些吃力。 3. Java其实非常好,但不是脚本,仅此而已。 ##开发这个框架的目的: 1. 现有框架如Django, SQLAlchemy无法...

    JAVA上百实例源码以及开源项目源代码

     关于数字签名:产生RSA密钥对(myKeyPair),得到RSA密钥对,产生Signature对象,对用私钥对信息(info)签名,用指定算法产生签名对象,用私钥初始化签名对象,将待签名的数据传送给签名对象(须在初始化之后),用公钥...

    java开源包1

    MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...

    java开源包11

    MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...

    java开源包2

    MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...

    java开源包3

    MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...

    java开源包6

    MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...

    java开源包5

    MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...

    java开源包10

    MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...

    java开源包4

    MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...

    java开源包8

    MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...

    java开源包7

    MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...

    java开源包9

    MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...

    java开源包101

    MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...

    Java资源包01

    MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...

Global site tag (gtag.js) - Google Analytics