欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JRuby Sandbox加快启动速度

程序员文章站 2022-07-14 22:25:14
...
      一直很羡慕有些公司的研发流程自动化管理,可以极大的节省时间,而我们公司很多操作要手动去做,为此,我使用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的内存,始终感觉不太完美。先将将就就凑合凑合着用着吧。
     
相关标签: JRuby