`
renzhen
  • 浏览: 247948 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

JRuby Sandbox加快启动速度

阅读更多
      一直很羡慕有些公司的研发流程自动化管理,可以极大的节省时间,而我们公司很多操作要手动去做,为此,我使用Ruby语言写了不少脚本半自动化这些操作。
       原来我一直使用JRuby来运行脚本,一直受困于它缓慢的启动速度。于是我在前些时候利用MRI中Win32::Clipboard替换了Swing中剪切板操作,从而将大部分脚本移植到了MRI 1.9下,来解决了启动速度的问题。
       不过不是所有的脚本都能很好的移植到MRI下,有一些脚本使用了SVN操作,在JRuby中我使用SVNKit写了一个SVN操作类,开发一个脚本操作svn导出我提交的代码到指定目录,然后手工上传到测试服务器给产品经理看效果。在MRI里我还没有找到操纵SVN的好方法。
       我想过一个方法,就是写一个commander.rb ,常驻内存,按下回车后通过load执行SVN操作脚本,代码原型如下:
   
while true
    puts "press any key to run svnchangepath.rb"
	gets
        filename='svnchangepath.rb'
	load filename
	puts 'success'
	puts ''
end
    

       这个方法的确能加快速度,不过后面的执行结果不太正确,原因是每次load后执行的环境被污染了,容易出现很奇怪的bug。
       那有没有办法让load执行在一个独立的JRuby环境中呢,我想到了JRuby samples中的MVM功能,尝试失败,直到我找到了JRuby Sandbox这个gem,才真正解决了这个问题,它的github地址:https://github.com/omghax/jruby-sandbox
       通过jgem install jruby_sandbox安装这个gem,然后修改上述代码,将load在sandbox中运行,问题解决。
      
#encoding: utf-8
require "sandbox"
while true
    puts "press any key to run svnchangepath.rb"
	gets
	filename='svnchangepath.rb'
	sand = Sandbox::Full.new
	sand.eval("load '#{filename}' ")
	puts 'success'
	puts ''
end
      


      启动速度的问题解决了,不过占去了大约50M的内存,始终感觉不太完美。先将将就就凑合凑合着用着吧。
     
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics