class VirtualModule::FileIpcInterface
Constants
- INPUT
- MAIN_LOOP
- OUTPUT
Public Class Methods
new(provider)
click to toggle source
Calls superclass method
VirtualModule::BaseIpcInterface::new
# File lib/virtual_module.rb, line 536 def initialize(provider) super File.mkfifo("#{@work_dir}/#{INPUT}") File.mkfifo("#{@work_dir}/#{OUTPUT}") at_exit do Process.kill(:KILL, @pid) if !@pid.nil? FileUtils.remove_entry @work_dir if File.directory?(@work_dir) end end
Public Instance Methods
call(receiver, name, *args, **kwargs)
click to toggle source
# File lib/virtual_module.rb, line 546 def call(receiver, name, *args, **kwargs) #require 'byebug' #byebug if Helper.is_installed?(@provider.lang) enqueue @provider.generate_message("#{@work_dir}/#{INPUT}", receiver, name, *args, **kwargs) elsif Helper.is_installed?(:docker) enqueue @provider.generate_message("/opt/#{INPUT}", receiver, name, *args, **kwargs) else raise Exception.new("Either #{@provider.lang} or docker command is required to run virtual_module") end response = dequeue case response[0..5] when "\xC1VMERR" then raise RuntimeException, "An error occurred while executing the command in #{@provider.lang} process: " + response[6..-1] when "\xC1VMOBJ" then raise StandardError.new(response) else begin MessagePack.unpack(response) rescue raise StandardError.new(response) end end end
reset(source)
click to toggle source
Calls superclass method
VirtualModule::BaseIpcInterface#reset
# File lib/virtual_module.rb, line 574 def reset(source) super restart_server_process end
serialize(object_lookup_id)
click to toggle source
# File lib/virtual_module.rb, line 569 def serialize(object_lookup_id) enqueue "\n#{object_lookup_id}" dequeue end
Private Instance Methods
dequeue()
click to toggle source
# File lib/virtual_module.rb, line 615 def dequeue File.open("#{@work_dir}/#{OUTPUT}", 'r'){|f| f.read} end
enqueue(message)
click to toggle source
# File lib/virtual_module.rb, line 611 def enqueue(message) File.write("#{@work_dir}/#{INPUT}", message) end
restart_server_process()
click to toggle source
# File lib/virtual_module.rb, line 580 def restart_server_process if !@pid.nil? begin Process.getpgid(@pid) Process.kill(:KILL, @pid) rescue Errno::ESRCH end @pid=nil end File.write("#{@work_dir}/#{LIB_SCRIPT}.#{@provider.class::EXT}", @provider.lib_script) File.write("#{@work_dir}/#{MAIN_LOOP}.#{@provider.class::EXT}", @provider.main_loop("#{@work_dir}/#{INPUT}", "#{@work_dir}/#{OUTPUT}", LIB_SCRIPT)) case @provider.lang when :julia if Helper.is_installed?(:julia) command = "julia --depwarn=no -L #{@work_dir}/#{LIB_SCRIPT}.#{@provider.class::EXT} #{@work_dir}/#{MAIN_LOOP}.#{@provider.class::EXT}" elsif Helper.is_installed?(:docker) command = "docker run -v #{@work_dir}/:/opt/ remore/virtual_module julia --depwarn=no -L /opt/#{LIB_SCRIPT}.#{@provider.class::EXT} /opt/#{MAIN_LOOP}.#{@provider.class::EXT}" else raise Exception.new("Either julia or docker command is required to run virtual_module") end when :python # -B : Prevent us from creating *.pyc cache - this will be problematic when we call #virtual_module_eval repeatedly. command = "python -B #{@work_dir}/#{MAIN_LOOP}.#{@provider.class::EXT}" else raise Exception.new("Unsupported language was specified") end @pid = Process.spawn(command, :err => :out,:out => "/dev/null") # , :pgroup => Process.pid) #@pid = Process.spawn(command) # , :pgroup => Process.pid) Process.detach @pid end